Сравнение меток времени в Dynamodb DB Query не работает должным образом - PullRequest
0 голосов
/ 07 июня 2019

Сравнение меток времени в Dynamodb (ссылка: https://www.abhayachauhan.com/2017/12/how-to-store-dates-or-timestamps-in-dynamodb/) не работает должным образом.

атрибуты Dynamod db со значениями в одну строку:
id : "123", triggerDate : "2019-06-07T15: 10: 18.252Z"

Не просыпающийся чехол : Допустим, код выполняется после времени «triggerDate», чтобы встретить «triggerDate» меньше чем «currentTime» (triggerDate < :t).

  var currentTime = new Date();
  currentTime = JSON.stringify(currentTime);
  console.log("currentTime:", currentTime);
  let params = {
    TableName: TABLE_NAME,
    KeyConditionExpression: "id = :i AND triggerDate < :t",
    ExpressionAttributeValues: {
      ":t": { S: currentTime },
      ":i": { S: "123"}
    }
  };
  const data = await dynamodb.query(params).promise();
  console.log(JSON.stringify(data));

выход
2019-06-08T05:09:02.782Z c4f65ba2-3d3d-43f6-833f-51735bbdcda5 INFO currentTime: "2019-06-08T05:09:02.781Z"
2019-06-08T05:09:03.480Z c4f65ba2-3d3d-43f6-833f-51735bbdcda5 INFO {"Items":[],"Count":0,"ScannedCount":0}

Здесь DynamodB не будет возвращать результат, даже если «triggerDate» меньше чем «currentTime» (triggerDate < :t).

Рабочий случай : где currentTime жестко закодирован вместо чтения из new Date(), чтобы встретить «triggerDate» меньше чем «currentTime».

  let currentTime = "2019-06-08T05:09:02.781Z";
  let params = {
    TableName: TABLE_NAME,
    KeyConditionExpression: "id = :i AND triggerDate < :t",
    ExpressionAttributeValues: {
      ":t": { S: currentTime },
      ":i": { S: "123"}
    }
  };
  const data = await dynamodb.query(params).promise();
  console.log(JSON.stringify(data));

выход
2019-06-08T04:35:54.775Z 60f87d6c-0ffb-477a-95ab-cfaec8025d53 INFO currentTime: "2019-06-08T05:09:02.781Z"
2019-06-08T04:35:55.594Z 60f87d6c-0ffb-477a-95ab-cfaec8025d53 INFO {"Items":[{"id":{"S":"124"},"triggerDate":{"S":"2019-06-07T15:53:54.107Z"}}],"Count":1,"ScannedCount":1}

Dynamodb вернет результат здесь.

Почему в Не работает DynamoDb не возвращает никаких данных, даже если «triggerDate» меньше чем «currentTime»?
Я что-то пропустил?
Кто-нибудь может объяснить это поведение?

1 Ответ

1 голос
/ 07 июня 2019

Преобразование объекта даты в строку с использованием JSON.stringify () является неправильным способом решения этой проблемы и, скорее всего, приводит к неправильному форматированию. Вместо этого вам следует преобразовать объект даты в строку с помощью функции Date.toISOString () .

currentTime = currentTime.toISOString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...