2017-04-05 154 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有關聯成本),但「正確」的做法是全球二級指數。