如何使用AWS Lambda按名称查询dynamoDB表

时间:2017-04-05 20:30:26

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

我有dynamoDB表,

表名xx

主分区键id(号码)

主要排序键name(字符串)

我想通过name查询。

'use strict';
const AWS = require("aws-sdk");
const dynamodb = new AWS.DynamoDB();
const docClient = new AWS.DynamoDB.DocumentClient();

exports.handler = function(event, ctx, callback) {

    var params = {
          TableName: 'xx',

            KeyConditionExpression: "#name = :name",
                 ExpressionAttributeNames:{
            "#name": "name"
        },
                     ExpressionAttributeValues: {
            ":name":event.name
        }
    };

    docClient.query(params, function(err, data){
        if(err){
            callback(err, null);
        }else{
            callback(null, data);
        }
    });
}

但我收到一个错误:"查询条件错过了关键架构元素:id:"怎么处理?

1 个答案:

答案 0 :(得分:6)

DynamoDB是NoSQL数据库,因此您只能默认查询主键。你有几个选择:

  • 创建全局二级索引并对其进行查询(Link):

      

    “全局二级索引包含基表中的一系列属性,但它们由一个与表的主键不同的主键组织。索引键不需要具有来自表的任何键属性。 table;它甚至不需要具有与表相同的密钥模式。“

  • 扫描而不是查询:

    var params=  {
        TableName:'xx',
        ProjectionExpression:'name', // remove this string if you want to get not only 'name'
        FilterExpression:'name = :name',
        ExpressionAttributeValues:{ ":name" : event.name }
    };
    
    docClient.scan(params, function(err, data){
        if(err){
            callback(err, null);
        }else{
            callback(null, data);
       }
    });
    

如果您的表格不会很大,扫描是更容易和更便宜的方式(我相信全球二级指标有相关成本),但“正确”的方法是使用全球二级指数。< / p>