我正在尝试在两个日期之间实施查询,但是根据我了解的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",
};