DynamoDB扫描获取nodejs上对象的属性

DynamoDB Scan get attribute of object on nodejs

我目前正在使用以下方法获取数据库中的所有条目:

const params = {        
  TableName: process.env.AWS_DYNAMODB_TABLE,
  Select: "SPECIFIC_ATTRIBUTES",  
  AttributesToGet: ["SessionValue"]                                                                                                                                             
};           

dynamoClient.scan(params, function(err, data) {
  console.log("GetItem succeeded:", JSON.stringify(data, null, 2));
});

问题是我不需要 SessionValue 中的所有内容,这是一个非常大的对象。相反,我想做类似的事情:

const params = {        
  TableName: process.env.AWS_DYNAMODB_TABLE,
  Select: "SPECIFIC_ATTRIBUTES",  
  AttributesToGet: ["SessionValue.wallet.keys"]                                                                                                                                             
};           

但是 运行 以上没有 return 任何东西。在 nodejs 上使用 DynamoDb 可以吗?

您可以使用 Projection Expression

var AWS = require('aws-sdk');
var dynamoClient = new AWS.DynamoDB.DocumentClient();

const params = {        
    TableName: process.env.AWS_DYNAMODB_TABLE,
    ExpressionAttributeNames: {
        "#S": "SessionValue",
        "#w": "wallet",
        "#k": "keys",
    },
    Select: "SPECIFIC_ATTRIBUTES",
    ProjectionExpression: "#S.#w.#k",                                                                                                                                        
};

dynamoClient.scan(params, function(err, data) {
    if (err) {
        console.log(err, err.stack);
    } else {
        console.log("GetItem succeeded:", JSON.stringify(data, null, 2));
    }
});

注意响应包括完整的对象信封可能很重要,因此您必须在成功回调中将其解包(如果您可能希望 Scan 调用只是 return嵌套项目)。来自模拟 table 的示例响应如下。

GetItem succeeded: {
  "Items": [
    {
      "SessionValue": {
        "wallet": {
          "keys": [
            "brad001",
            "brad002"
          ]
        }
      }
    },
    {
      "SessionValue": {
        "wallet": {
          "keys": [
            "foo001",
            "foo002"
          ]
        }
      }
    }
  ],
  "Count": 2,
  "ScannedCount": 2
}