Fai*_*Ali 4 javascript nosql node.js amazon-dynamodb
我想扫描过去 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) => {
// ...
}
Run Code Online (Sandbox Code Playgroud)
这是因为 dynamoDbSCAN 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
}
}
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3111 次 |
| 最近记录: |