DynamoDB: запрашивать только каждое 10-е значение


Я запрашиваю данные между двумя конкретными значениями unixtime. например:

Все данные между 1516338730 (сегодня, 6: 12) и 1516358930 (сегодня, 11: 48)

Моя база данных получает новую запись каждую минуту. Теперь, когда я хочу запросить данные за последние 24 часа,он слишком плотный. каждая 10-я минута была бы идеальной.

Теперь мой вопрос: как я могу прочитать только каждую 10-ю запись базы данных, используя DynamoDB?

Насколько я знаю, нет возможность использовать модуль или что-то подобное, что удовлетворяет мои потребности.

Вот мой лямбда-код AWS:

  var read = {
    TableName: "user",
    ProjectionExpression:"#time, #val",
    KeyConditionExpression: "Id = :id and TIME between :time_1 and :time_2",
    ExpressionAttributeNames:{
        "#time": "TIME",
        "#val": "user_data"
    },
    ExpressionAttributeValues: { 
      ":id": event, // primary key 
      ":time_1": 1516338730,
      ":time_2": 1516358930
    },
    ScanIndexForward: true
  };
  docClient.query(read, function(err, data) {
    if(err) {
      callback(err, null);
    }
    else {
      callback(null, data.Items);
    }
  });
};
2 3

2 ответа:

Вы говорите, что вставляете 1 запись каждую минуту?

Следующим вариантом может быть:

В момент вставки установите на запись другое поле, назовем его MinuteBucket, которое вычисляется как the timestamp's minute value mod 10.

Если вы делаете это с помощью функции потока, вы можете обрабатывать новые записи, а затем написать что-то, чтобы коснуться старых записей, чтобы заставить вычисление.

Ваш запрос изменится на следующий:

/*...snip...*/
KeyConditionExpression: "Id = :id and TIME between :time_1 and :time_2 and MinuteBucket = :bucket_id",
/*...snip...*/
ExpressionAttributeValues: { 
  ":id": event, // primary key 
  ":time_1": 1516338730,
  ":time_2": 1516358930,
  ":bucket_id": 0 //can be 0-9, if you want the first record to be closer to time_1, then set this to :time_1 minute value mod 10
},
/*...snip...*/

Просто в качестве последующей мысли: если вы хотите ускорить ваши запросы, возможно, исследовать использование MinuteBucket в индексе, хотя это может стоить дороже.

Я не думаю, что это возможно с помощью dynamoDB API.

Существуют выражения FilterExpression, содержащие условия, которые DynamoDB применяет после операции запроса, но до того, как данные будут возвращены вам. Но насколько мне известно это не возможно, чтобы использовать пользовательскую функцию. И встроенные функции плохи.

В качестве обходного пути можно отметить каждый 10-й элемент на стороне клиента. А затем запрос с проверкой attribute_exists (или значения атрибута), чтобы отфильтровать их.

Кстати, это было бы неплохо создать индекс для атрибута 'Id' с ключом сортировки 'TIME' для повышения производительности запроса.