12

我正在尝试使用 Node JS AWS-SDK 从 DynamoDB 表中获取项目。该功能getItem运行良好,但BatchGetItem更难使用。

我使用官方文档: http ://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/Client.html#batchGetItem-property

我正在寻找有关如何正确使用此功能的示例,但找不到任何示例。我写的代码是:

var params = {

"RequestItems" : {
    "Keys" : [
      {"HashKeyElement" : { "N" : "1000" } },
      {"HashKeyElement" : { "N" : "1001" } }
    ]
  }
}

db.client.batchGetItem(params, function(err, data) {
  console.log('error: '+ err);
  console.log(jsDump.parse(data));
});

我收到一个SerializationException: Start of list found where not expected错误,但就我的 NodeJS 和 JSON 专业知识而言,我的语法是正确的。但这令人困惑: http ://docs.aws.amazon.com/amazondynamodb/latest/developerguide/API_BatchGetItems.html

在该语法示例中,您必须提供表名。

4

7 回答 7

14

我使用了 dynamo db 客户端版本......经过一个小时的研究,我设法让它工作......

var params = {

RequestItems: { // map of TableName to list of Key to get from each table
    Music: {
        Keys: [ // a list of primary key value maps
            {
                Artist: 'No One You Know',
                SongTitle:'Call Me Today'
                // ... more key attributes, if the primary key is hash/range
            },
            // ... more keys to get from this table ...
        ],
        AttributesToGet: [ // option (attributes to retrieve from this table)
            'AlbumTitle',
            // ... more attribute names ...
        ],
        ConsistentRead: false, // optional (true | false)
    },
    // ... more tables and keys ...
},
ReturnConsumedCapacity: 'NONE', // optional (NONE | TOTAL | INDEXES)
};
docClient.batchGet(params, function(err, data) {
    if (err) ppJson(err); // an error occurred
    else ppJson(data); // successful response

});
于 2016-05-28T23:06:34.217 回答
8

我感觉到你的痛苦...... AWS 文档充其量是令人困惑的。我认为这是由老化的基础设施和糟糕的技术写作造成的。SDK 使用的 nodejs 和 JSON 语法让我想起了 XML 结构。

无论如何,我设法让 BatchGetItem 在整整一个小时后工作。参数应如下所示:

{
    "RequestItems": {
        "<TableName>": {
            "Keys": [
                {"<HashKeyName>": {"<type>":"<hash key value>"}},
                {"<HashKeyName>": {"<type>":"<hash key value>"}},
                {"<HashKeyName>": {"<type>":"<hash key value>"}}
            ]
        }
    }
}
于 2014-02-15T00:14:03.577 回答
3

我相信您缺少表名。你要这个:

var params = {

"RequestItems" : {
    "TableName": {
      "Keys" : [
        {"HashKeyElement" : { "N" : "1000" } },
        {"HashKeyElement" : { "N" : "1001" } }
      ]
    }
  }
}
于 2013-05-10T00:27:01.837 回答
2

我在这里尝试了所有解决方案,但没有一个对我有用,这可能意味着 NodeJS 库已经更新。参考他们更好的书面文档,您应该能够提出如下请求:

var params = {
  RequestItems: {
    'Table-1': {
      Keys: [
        {
           HashKey: 'haskey',
           NumberRangeKey: 1
        }
      ]
    },
    'Table-2': {
      Keys: [
        { foo: 'bar' },
      ]
    }
  }
};

var docClient = new AWS.DynamoDB.DocumentClient();

docClient.batchGet(params, function(err, data) {
  if (err) console.log(err);
  else console.log(data);
});

具体来说,不再需要提供类型。

于 2017-03-06T20:45:20.260 回答
0

在您的情况下,正确答案应该是:

var params = {
    "RequestItems": {
        "<table_name>": {
           "Keys": [
                {"HashKeyElement" : { "N" : "1000" } },
                {"HashKeyElement" : { "N" : "1001" } }
           ]
       }
    }
}
于 2014-01-13T01:24:16.420 回答
0

尝试这个:

db.client.batchGetItem(
{"RequestItems":{
     "TableName":{
           "Keys":[
               {"HashKeyElement"  : {"N":"1000"}},
               {"HashKeyElement"  : {"N":"1001"}}
           ]
       }
    }
}, function(err, result){ //handle error and result here  });
于 2013-06-28T10:58:30.423 回答
-1

试试这个,虽然它未经测试:

var params = {
    TableName: "tableName",
    RequestItems : {
        Keys : [
            {
                HashKeyElement : { N : "1000" } 
            },
            {
                HashKeyElement : { N : "1001" } 
            }
        ]
    }
}
于 2013-06-06T06:20:13.227 回答