AWS Lambda:如何将数字添加到Dynamodb中的NS集

时间:2016-08-14 19:58:36

标签: javascript amazon-web-services set amazon-dynamodb aws-lambda

问题

我尝试了几种方法,但是还没有找到如何在NS集中添加数字的方法。这都在lambda函数中运行。

我想要完成的事情

我正在创建一个dynamodb表,其中十六进制中的不同颜色与一组id对齐。我正在优化表以便快速读取并避免重复,这就是为什么我想为每个十六进制维护一组id。

我如何在表格中添加项目:

let doc = require('dynamodb-doc');
let dynamo = new doc.DynamoDB();

var object = {
    'TableName': 'Hex',
    'Item': {
        'hex': '#FEFEFE',
        'ids': {
            'NS': [2,3,4]
        }
    }
}

dynamo.putItem(object, callback);

结果为

results after adding to table

然后我尝试向集合

添加更多ID

使用Dynamodb Update Item Documentation标准

var params = {
    "TableName" : "Hex",
    "Key": {
      "hex": "#FEFEFE"
    },
    "UpdateExpression" : "ADD #oldIds :newIds",
    "ExpressionAttributeNames" : {
      "#oldIds" : "ids"
    },
    "ExpressionAttributeValues": { 
      ":newIds" : {"NS": ["5", "6"]}
   },
};

dynamo.updateItem(params, callback);

这会返回以下错误,因此dynamo认为:newIds是地图类型而不是集合(?)

"errorMessage": "Invalid UpdateExpression: Incorrect operand type for operator or function; operator: ADD, operand type: MAP"

我也尝试过这些替代方法

尝试2:

var setTest = new Set([5, 6]);

var params = {
    "TableName" : "Hex",
    "Key": {
      "hex": "#FEFEFE"
    },
    "UpdateExpression" : "ADD #oldIds :newIds",
    "ExpressionAttributeNames" : {
      "#oldIds" : "ids"
    },
    "ExpressionAttributeValues": { 
      ":newIds" : setTest
   },
};

dynamo.updateItem(params, callback);

错误2(同样的错误):

"errorMessage": "Invalid UpdateExpression: Incorrect operand type for operator or function; operator: ADD, operand type: MAP"

尝试3:

var params = {
    "TableName" : "Hex",
    "Key": {
      "hex": "#FEFEFE"
    },
    "UpdateExpression" : "ADD #oldIds :newIds",
    "ExpressionAttributeNames" : {
      "#oldIds" : "ids"
    },
    "ExpressionAttributeValues": { 
      ":newIds" : { "NS" : { "L" : [ { "N" : "5" }, { "N" : "6" } ] }}
   },
};

dynamo.updateItem(params, callback);

错误3(同样的错误):

"errorMessage": "Invalid UpdateExpression: Incorrect operand type for operator or function; operator: ADD, operand type: MAP"

尝试4:

var params = {
    "TableName" : "Hex",
    "Key": {
      "hex": "#FEFEFE"
    },
    "UpdateExpression" : "ADD #oldIds :newIds",
    "ExpressionAttributeNames" : {
      "#oldIds" : "ids"
    },
    "ExpressionAttributeValues": { 
      ":newIds" : [5,6]
   },
};

dynamo.updateItem(params, callback);

错误4(类似的错误,但发电机认为我这次添加了一个清单)

"errorMessage": "Invalid UpdateExpression: Incorrect operand type for operator or function; operator: ADD, operand type: LIST"

Stack Overflow / Github我试过的问题

https://stackoverflow.com/a/37585600/4975772(我添加到一个集合,而不是列表)

https://stackoverflow.com/a/37143879/4975772(我使用的是javascript,而不是python,但我基本上需要同样的东西只是不同的语法)

https://github.com/awslabs/dynamodb-document-js-sdk/issues/40#issuecomment-123003444(我需要做到这一点,但我没有使用dynamodb-document-js-sdk,我使用的是AWS Lambda

2 个答案:

答案 0 :(得分:5)

我也一直在努力解决这个问题。我发现DynamoDB实际上有2个api。

AWS.DynamoDB

AWS.DynamoDBDocumentClient

和你一样,我无法使ADD功能正常工作。我尝试导入并使用DynamoDB api而不是DynamoDBDocumentClient api。它解决了我的问题。下面是我的代码片段,它与DynamoDB api一起使用,但不与DynamoDBDocumentClient api一起使用。我使用的是字符串集而不是数字集,但我认为这不会产生任何影响。

var AWS = require('aws-sdk');
var dynamo = new AWS.DynamoDB();
// var dynamo = new AWS.DynamoDB.DocumentClient();

...

var params = {};
params.TableName = “MyTable”;
params.ExpressionAttributeValues = { ':newIds': { "SS": ["someId"] } };
// :newIds represents a new dynamodb set with 1 element
params.UpdateExpression = "ADD someAttribute :newIds";
dynamoClient.updateItem(params, function(err, data) { ….}

答案 1 :(得分:0)

  

此答案可能对正在使用npm dynamoDB的用户有所帮助   模块

我们有同样的问题。因为我们正在使用npm dynamodb模块进行查询,而不是从AWS.DynamoDB模块导出,所以给定AWS.DynamoDBDocumentClint的解决方案是可以实施的,除非我们可以从npm dynamoDb模块转换为AWS.DynamoDB查询。因此,而不是转移/转换查询。

  

我们试图将dynamoDB npm模块降级为〜1.1.0版本,并且可以正常工作。   以前的版本是1.2.X。