![](/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.