日期之间的DynamoDB查询

时间:2020-10-08 11:32:08

标签: amazon-dynamodb dynamodb-queries amazon-dynamodb-index

我正在尝试在两个日期之间实施查询,但是根据我了解的here以及其他许多来源,这是不可能的。您必须传递一个ID进行过滤才能使用查询。 仅在日期之间进行过滤的唯一方法是使用扫描...然后,我认为,根据我的表结构,将所有不同的sourceName保存在另一个表中,该表将保存我的所有sourceName以及当我想查询之间的表时日期,我将首先查询该表中的所有sourceName,然后使用每个sourceName查询主表。

我只是想了解一下扫描是否真的更好,或者还有更好的选择?

这是我的表结构:

主分区键recordID(字符串)

createdAt: Number,
data: Map,
recordId: String,
sourceName: String,
updatedAt: Number

示例:

所有这些过程都在lambda上起作用,我从用户lastUpdateFrom(数字)和lastUpdateTo(数字)获取

然后我要执行以下操作:

 let params = {
        TableName: process.env.RECORDS_TABLE_NAME,
        IndexName: 'updatedAt-index',
        KeyConditionExpression: "updatedAt BETWEEN :lastUpdateFrom AND :lastUpdateTo",
        ExpressionAttributeValues: {
          ":lastUpdateFrom":{
            N: lastUpdateFrom,
          },
          ":lastUpdateTo":{
            N: lastUpdateTo,
          }
        },
        ProjectionExpression: "recordID",
      };

但是这是不可能的,那么我想到的是获取所有源并使用lastUpdateFrom和lastUpdateTo查询每个源,并使用我创建的索引进行查询(分区键sourceName和sort键updatedAt)

示例:

const sources = await getAllRecords();
const dbCalls = [];
for (var i = 0; i < sources.Count; i++) {
   dbCalls.push(getRecordsBetweenDatesFilteredWithSource(sources.Items[i].sourceName.S, lastUpdateFrom, lastUpdateTo, skip, limit));
}
return Promise.all(dbCalls);



const getAllRecords = async () => {
    return DDB.scan({
        TableName: process.env.SOURCES_TABLE_NAME,
        ProjectionExpression: "sourceName",
      }).promise();
}

然后我的查询将如下所示:

let params = {
        TableName: process.env.RECORDS_TABLE_NAME,
        IndexName: 'sourceName-updatedAt-index',
        KeyConditionExpression: "sourceName = :sn AND updatedAt BETWEEN :lastUpdateFrom AND :lastUpdateTo",
        ExpressionAttributeValues: {
          ":lastUpdateFrom":{
            N: lastUpdateFrom,
          },
          ":lastUpdateTo":{
            N: lastUpdateTo,
          },
          ":sn":{S: sourceName}
        },
        ProjectionExpression: "recordID",
};

0 个答案:

没有答案