如何使用 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 表的主要内容,如果未能解决你的问题,请参考以下文章

lambda 函数中 api 键的 aws appsync 环境变量

AWS lambda 类似于 Haskell 函数的执行

如何将AWS API网关阶段指向特定的lambda函数别名?

AWS AppSync Lambda 解析器获取查询返回类型

如何访问 AWS Lambda 中的标头?

在多个 AWS Lambda 中处理相同的函数名称