![](/img/trans.png)
[英]Scan Function in DynamoDB with reserved keyword as FilterExpression NodeJS
[英]nodejs DynamoDB Scan by Mapped Items
我有一个 DynamoDB 表,我想在其中返回 Review.ID 映射值等于 123 的所有项目。
Item: {
id: 1,
review: {
Id: 123,
step1: 456,
step2: 789,
step3: 1234,
},
// Add more items here
},
Item: {
id: 2,
review: {
Id: 123,
step1: 999,
step2: 888,
step3: 777,
},
// Add more items here
},
理想回报示例:
id: 1,
review: {
- id: 123,
- step: 456,
- step2: 789,
- step3: 1234,
}
id: 2,
review: {
- id: 123,
- step: 999,
- step2: 888,
- step3: 777,
}
这是我在 NodeJS 中的当前代码
exports.handler = async (event, context, callback) => {
const params = {
FilterExpression: "review.Id = :review",
ExpressionAttributeValues: {
":review": 123,
},
TableName: "sometable"
};
let promise = dynamoDb.scan(params).promise();
let result = await promise;
let data = result.Items;
if (result.LastEvaluatedKey) {
params.ExclusiveStartKey = result.LastEvaluatedKey;
data = data.concat(await (params));
}
// create a response
const response = {
statusCode: 200,
body: JSON.stringify(data),
};
callback(null, response);
};
运行此代码,我得到一个空结果 []。
对此的任何帮助将不胜感激。
您尚未显示所有代码,但我建议问题在于您的dynamoDb
客户端是低级DynamoDB Client而不是高级Document Client 。 他们使用不同的方式提供属性值。 您正在使用低级别 DynamoDB 客户端,但指示属性值就像您正在使用高级文档客户端一样。
这是一个对比两种客户端方法的示例:
const AWS = require('aws-sdk');
AWS.config.update({ region: 'us-east-1' });
// High-level Document Client
const dc = new AWS.DynamoDB.DocumentClient();
// High-level scan parameters for Document Client
const paramsDC = {
FilterExpression: "review.Id = :review",
ExpressionAttributeValues: {
":review": 123,
},
TableName: "sometable"
};
// Low-level DynamoDB Client
const db = new AWS.DynamoDB();
// Low-level scan parameters for DynamoDB Client
const paramsDB = {
FilterExpression: "review.Id = :review",
ExpressionAttributeValues: {
":review": { "N": "123" },
},
TableName: "sometable"
};
(async() => {
// High-level scan
const resultDC = await dc.scan(paramsDC).promise();
console.log('DC Items:', JSON.stringify(resultDC.Items));
// Low-level scan
const resultDB = await db.scan(paramsDB).promise();
console.log('DB Items:', JSON.stringify(resultDB.Items));
})();
这导致:
DC Items: [{"review":{"step":999,"id":123},"id":2},{"review":{"step":456,"id":123},"id":1}]
DB Items: [{"review":{"M":{"step":{"N":"999"},"id":{"N":"123"}}},"id":{"N":"2"}},{"review":{"M":{"step":{"N":"456"},"id":{"N":"123"}}},"id":{"N":"1"}}]
请注意,低级别 DynamoDB 客户端响应看起来有些不同,但实际上只是相同结果的不同(未编组)表示。 它包括"id":{"N":"1"}
,它表示id
是一个值为1
的数字,其中 Document Client 显示"id":1
。 低级结果包括"M": {... }
这是映射,而高级文档客户端会自动为您将这些解组为 JavaScript 对象。
底线:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.