Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用AWS Lambda按名称查询dynamoDB表_Node.js_Amazon Web Services_Amazon Dynamodb_Aws Lambda - Fatal编程技术网

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

Node.js 如何使用AWS Lambda按名称查询dynamoDB表,node.js,amazon-web-services,amazon-dynamodb,aws-lambda,Node.js,Amazon Web Services,Amazon Dynamodb,Aws Lambda,我有dynamoDB桌 表名xx 主分区键id(编号) 主排序键名称(字符串) 我想通过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 p

我有dynamoDB桌

表名
xx

主分区键
id
(编号)

主排序键
名称
(字符串)

我想通过
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:”如何处理

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

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

    全局辅助索引包含从基表中选择的属性,但它们由不同于表的主键组织。索引键不需要具有表中的任何键属性;甚至不需要具有与表相同的键架构

  • 扫描而不是查询:

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

如果您的表不会太大,那么扫描是一种更简单、更便宜的方法(我相信全局二级索引有相关的成本),但“正确”的方法是使用全局二级索引。

事实上,这是导致解决方案的唯一答案。也许我是瞎的,但我没有发现关于只使用主键的查询的任何信息。非常非常感谢。