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

jos*_*ell 5 javascript set amazon-web-services 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);
Run Code Online (Sandbox Code Playgroud)

结果如何

添加到表后的结果

然后我尝试在集合中添加更多ID

使用Dynamodb更新项目文档标准

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

dynamo.updateItem(params, callback);
Run Code Online (Sandbox Code Playgroud)

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

"errorMessage": "Invalid UpdateExpression: Incorrect operand type for operator or function; operator: ADD, operand type: MAP"
Run Code Online (Sandbox Code Playgroud)

我也试过这些替代方法

试试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);
Run Code Online (Sandbox Code Playgroud)

错误2(同样的错误):

"errorMessage": "Invalid UpdateExpression: Incorrect operand type for operator or function; operator: ADD, operand type: MAP"
Run Code Online (Sandbox Code Playgroud)

尝试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);
Run Code Online (Sandbox Code Playgroud)

错误3(同样的错误):

"errorMessage": "Invalid UpdateExpression: Incorrect operand type for operator or function; operator: ADD, operand type: MAP"
Run Code Online (Sandbox Code Playgroud)

尝试4:

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

dynamo.updateItem(params, callback);
Run Code Online (Sandbox Code Playgroud)

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

"errorMessage": "Invalid UpdateExpression: Incorrect operand type for operator or function; operator: ADD, operand type: LIST"
Run Code Online (Sandbox Code Playgroud)

Stack Overflow/Github我试过的问题

/sf/answers/2630992031/(我正在添加一个集合,而不是列表)

/sf/answers/2600071561/(我使用的是javascript,而不是python,但我基本上需要同样的东西只是不同的语法)

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

jos*_*ell 9

如何创建集并向集添加项

let AWS = require('aws-sdk');
let docClient = new AWS.DynamoDB.DocumentClient();

...

var params = {
    TableName : 'Hex',
    Key: {'hex': '#FEFEFE'},
    UpdateExpression : 'ADD #oldIds :newIds',
    ExpressionAttributeNames : {
      '#oldIds' : 'ids'
    },
    ExpressionAttributeValues : {
      ':newIds' : docClient.createSet([1,2])
    }
};

docClient.update(params, callback);
Run Code Online (Sandbox Code Playgroud)

这导致了这个dynamodb表:

使用

如果该集不存在,那么该代码将为您创建它.您还可以使用其他集运行该代码以更新集合的元素.超级方便.

创建集并向集添加项(OLD API)

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

var params = {
    TableName : 'Hex',
    Key: {'hex': '#555555'},
    UpdateExpression : 'ADD #oldIds :newIds',
    ExpressionAttributeNames : {
      '#oldIds' : 'ids'
    },
    ExpressionAttributeValues : {
      ':newIds' : dynamo.Set([2,3], 'N')
    }
};

dynamo.updateItem(params, callback);
Run Code Online (Sandbox Code Playgroud)

(不要将此代码用于将来的开发,我只将其包含在内以帮助使用现有DynamoDB Document SDK的任何人)

为什么原版失败了

请注意,当我问这个问题时,结果集看起来像一个文字的json地图对象(在dynamodb屏幕截图中查看),这将解释此错误消息

"errorMessage": "Invalid UpdateExpression: Incorrect operand type for operator or function; operator: ADD, operand type: MAP"
Run Code Online (Sandbox Code Playgroud)

所以我使用了错误的语法.该解决方案可在(现在已删除的)AWS Labs dynamodb-document-js-sdk文档中找到

可以在此处查看较新的Document Client的完整文档:http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html


Pet*_*ema 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) { ….}
Run Code Online (Sandbox Code Playgroud)