我尝试了几种方法,但是还没有找到如何在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);
使用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"
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
答案 0 :(得分:5)
我也一直在努力解决这个问题。我发现DynamoDB实际上有2个api。
和你一样,我无法使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。