我想扫描最近7天的所有项目,所以我要做的是生成7天的时间戳,并过滤大于该值的时间戳。但是此扫描返回了一些结果。
请参阅以下Javascript:
const daysBack = (days) => {
let date = new Date();
date.setDate(date.getDate() - days);
return date.getTime() ;
}
const params = {
TableName: process.env.DYNAMODB_TABLE,
FilterExpression: "#ts > :z",
ExpressionAttributeNames:{
"#ts": "timestamp"
},
ExpressionAttributeValues: {
":z": daysBack(7)
},
};
dynamoDb.scan(params, (error, result) => {
// ...
}
答案 0 :(得分:2)
这是因为dynamoDb在SCAN operation
上只会发送data upto 1mb only
。如果您想要的记录大小超过1mb,则会自动进行分页。
如果您记录结果,那么您将发现一个名为LastEvaluatedKey
的属性
如果存在此属性,那么您将不得不再次调用以获取剩余数据。此调用必须以递归方式实现,并且当LastEvaluatedKey
属性不存在时,您必须停止该调用。
让我们看一下这个示例,其中递归获取项目数据,然后将整个数据附加到数组中,然后发送。
let getFromDb = function (params, callback) {
params.ConsistentRead = true;
let projectCollection = [];
dynamodbclient.scan(params, onQuery);
function onQuery(err, data) {
const methodName = 'onQuery';
if (err) {
callback(err);
log.error(err, {
class: className,
func: methodName
});
} else {
for (let i = constant.LENGTH_ZERO; i < data.Items.length; i++) {
projectCollection.push(data.Items[i]);
}
if (typeof data.LastEvaluatedKey !== 'undefined') {
params.ExclusiveStartKey = data.LastEvaluatedKey;
dynamodbclient.scan(params, onQuery);
} else {
callback(err, projectCollection); //recursive call
}
}
}
};