2017-04-05 155 views
0

我dynamoDB表按名称查询dynamoDB表,如何使用AWS LAMBDA

表名称XX

主分区键ID(数字)

主排序关键字名称(字符串)

我想按名称查询它。

'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:”如何处理呢?

+0

这个问题实际上与AWS Lambda无关。您只需知道NodeJS代码即可查询DynamoDB,无论它在哪里运行,它都是相同的。另外,为什么用MySQL来标记? –

回答

2

听起来像id是表的主键。您需要在关键条件中包含id,或者执行scan而不是query

+0

那么它应该怎样看待扫描?使用扫描给我 “ExpressionAttributeNames只能在使用表达式时指定” –

2

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

如果你的表是不是将是巨大的扫描是这样做的容易和便宜的方式(我相信全球二次Indicies有关联成本),但“正确”的做法是全球二级指数。