从DynamoDB查询多个项目

时间:2019-09-23 15:26:08

标签: node.js amazon-web-services aws-lambda amazon-dynamodb

我正在AWS中设计一个简单的无服务器应用程序:API Gateway-> Lambda(node.js)-> DynamoDB。

我想在同一张表和与之对应的项目中保留客户数量

Client_id,否,商品,价格

0001,1,盒,10

0001,2,桌子,100

0002,1,椅子,20

0003、1,灯,15

我选择主键= Client_id,排序键=否,目前我可以使用“ dynamodb.get”功能获取单个项目,但是在为一个客户端获取所有项目时遇到问题。我尝试使用“ dynomodb.batchget”,但我需要知道表中有多少个项目并可能执行一些循环。 也许有不同的面糊方式可以从单个客户端获取所有商品?


const AWS = require('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient();

module.exports.get2 = (event, context, callback) => {

    var params = {
        "RequestItems": {
            "items": {
                "Keys": [{
                        id: Number(event.pathParameters.id),
                        no: 1
                    },
                    {
                        id: Number(event.pathParameters.id),
                        no: 2
                    }
                ]
            }
        },
        "ReturnConsumedCapacity": "TOTAL"
    };

    dynamoDb.batchGet(params, function(err, data) {
        if (err) {
            console.error(err);
            callback(null, {
                statusCode: err.statusCode || 501,
                headers: { 'Content-Type': 'text/plain' },
                body: 'Couldn\'t fetch the item.',
            });
            return;
        }
        const response = {
            statusCode: 200,
            body: JSON.stringify(data),
        };
        callback(null, response);
    });
};```

1 个答案:

答案 0 :(得分:2)

要查找给定Client_id的所有记录,请使用query。这是一个示例:

const AWS = require("aws-sdk");

AWS.config.update({region: 'us-east-1'});

const params = {
  TableName: 'mytable',
  KeyConditionExpression: 'Client_id = :Client_id',
  ExpressionAttributeValues: {
    ':Client_id': '0001',
  },
};

const dc = new AWS.DynamoDB.DocumentClient();

dc.query(params, (err, data) => {
  if (err) {
    console.log('Error', err);
  } else {
    for (const item of data.Items) {
      console.log('item:', item);
    };
  }
});

但是,如果您事先知道所需项的完整(分区和排序)键(而不是具有给定分区键的所有项),则可以使用batchGetItem

另外,请考虑使用SDK函数的promisified variants