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

AWS Lambda: How to Add Numbers to a NS Set in Dynamodb

问题

我尝试了多种方法,但一直无法找到如何将数字添加到 NS 集。这就是 lambda 函数中的全部 运行。

我想要完成的事情

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

我如何向 table 添加项目:

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);

结果是

然后我尝试向集合中添加更多 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);

这个returns下面的错误,所以dynamo认为:newIds是一个map类型而不是一个set(?)

"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(类似的错误,但dynamo认为我这次添加了一个列表)

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

堆栈 Overflow/Github 我试过的问题

(我添加到集合,而不是列表)

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

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

我也一直在努力解决这个问题。我发现 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) { ….}

如何创建集合并向集合添加项目

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);

这导致了这个 dynamodb table:

如果集合不存在,则该代码将为您创建。您还可以 运行 使用不同集合的代码来更新集合的元素。超级方便。

创建集合并向集合添加项目(旧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);

(请勿将此代码用于未来开发,我将其包括在内只是为了帮助任何使用现有 DynamoDB Document SDK 的人)

为什么原版失败了

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

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

所以我使用了错误的语法。解决方案位于(现已删除)AWS Labs dynamodb-document-js-sdk docs

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

This answer might be helpful to those who are using npm dynamoDB module

我们遇到了同样的问题。因为我们使用 npm dynamodb 模块进行查询,而不是从 AWS.DynamoDB module, given solution of AWS.DynamoDBDocumentClint was implementable untill and unless we could shift from npm dynamoDb module to AWS.DynamoDB 查询中导出。因此,而不是 shifting/transforming 查询。

We tried to downgrade dynamoDB npm module to version ~1.1.0 and it worked. Previous version was 1.2.X.