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

Posted

技术标签:

【中文标题】如何使用 AWS Lambda 按名称查询 dynamoDB 表【英文标题】:How to query dynamoDB table by name using AWS Lambda 【发布时间】:2017-04-05 20:30:26 【问题描述】:

我有 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】:

DynamoDB 是一个 NoSQL 数据库,因此默认情况下您只能查询主键。您有两种选择:

创建一个全局二级索引并针对它进行查询 (Link):

“全局二级索引包含从基表中选择的属性,但它们是由不同于表的主键组织的。索引键不需要具有来自基表的任何键属性表;它甚至不需要与表具有相同的键模式。”

扫描而不是查询:

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);
   
);

如果您的表不会很大,扫描是更简单、更便宜的方法(我相信全球二级指数有相关成本),但“正确”的方法是使用全球二级指数。

【讨论】:

实际上,这是导致解决方案的唯一答案。也许我是盲人,但我发现有关仅使用主键的查询的零信息。非常非常感谢。 只是一个简短的说明,使用scan时必须小心。 AWS 文档建议使用 query 而不是 scan。更多详情请查看docs.aws.amazon.com/amazondynamodb/latest/developerguide/…

以上是关于如何使用 AWS Lambda 按名称查询 dynamoDB 表的主要内容,如果未能解决你的问题,请参考以下文章