javascript - ए.डब्ल्यू.एस. लम्ब्डा: डायनामोडब में एनएस सेट में नंबर कैसे जोड़ें




amazon-web-services set (2)

समस्या

मैंने कई तरीकों की कोशिश की है, लेकिन एनएस सेट में संख्याओं को कैसे जोड़ने के बारे में पता नहीं चला है। यह सब लैम्ब्डा फ़ंक्शन के अंदर चल रहा है।

क्या मैं पूरा करने की कोशिश कर रहा हूँ

मैं एक डायनामोडब टेबल का निर्माण कर रहा हूं जहां हेक्स में भिन्न रंग आईडी के एक सेट में संरेखित करें। मैं तेजी से पढ़ता है और डुप्लिकेट से बचने के लिए तालिका का अनुकूलन कर रहा हूं, इसलिए मैं प्रत्येक हेक्स के लिए आईडी का एक सेट बनाए रखना चाहता हूं।

मैं तालिका में आइटम कैसे जोड़ रहा हूं:

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 अद्यतन आइटम प्रलेखन मानकों का उपयोग करना

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

dynamo.updateItem(params, callback);

यह निम्न त्रुटि देता है, इसलिए डायनेमो सोचती है: नयाइड्स सेट के बजाय एक नक्शा प्रकार है (?)

"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 (मैं जावास्क्रिप्ट का उपयोग कर रहा हूँ, अजगर नहीं, लेकिन मुझे मूल रूप से यह एक ही चीज़ की जरूरत है सिर्फ अलग सिंटैक्स)

https://github.com/awslabs/dynamodb-document-js-sdk/issues/40#issuecomment-123003444 (मुझे यह सटीक बात करने की ज़रूरत है, लेकिन मैं डायनामोड-दस्तावेज़- js-sdk, I का उपयोग नहीं कर रहा हूँ I 'एएमडब्ल्यू लैम्ब्डा का उपयोग कर रहा हूं


पीटर फेनेमा का उत्तर पूरी तरह से सही है। मैं बस इस बात पर विस्तार करना चाहता हूं कि मूल असफल क्यों हो रहा है और मूल रूप में उत्तर स्वरूपित उत्तर दिखाता है।

कुछ और खुदाई की, मुख्य मुद्दा वास्तव में जब मूल सेट बनाया जाता है लेकिन जैसे फेनेमा ने कहा, हम इस मुद्दे को पूरी तरह से बचने के लिए, सितंबर 2015 को जारी नए एपीआई का उपयोग कर सकते हैं । रिलीज दस्तावेज़ के अनुसार, यहाँ है

एक सेट बनाने के लिए सही तरीका और एक सेट में आइटम जोड़ें

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

इस डायनामोडब तालिका में कौन सी परिणाम है:

यदि सेट मौजूद नहीं है, तो वह कोड आपके लिए इसे बनाएगा सेट के तत्वों को अपडेट करने के लिए आप एक अलग सेट के साथ उस कोड को भी चला सकते हैं सुपर सुविधाजनक

क्यों मूल असफल रहा था

ध्यान दें कि जब मैंने प्रश्न पूछा, तो परिणामस्वरूप सेट एक शाब्दिक json मानचित्र ऑब्जेक्ट (जब डायनामोडब स्क्रीनशॉट में देखा गया) की तरह दिखाई दिया, जो इस त्रुटि संदेश को समझाएगा

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

इसलिए मैं गलत वाक्यविन्यास का उपयोग कर रहा था। समाधान (अब वंचित ) एडब्ल्यूएस लैब्स डायनामोड-दस्तावेज़-जेएस-एसडीके डॉक्स में पाया जाता है

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

(भविष्य के विकास के लिए इस कोड का उपयोग न करें, मैं इसे केवल मौजूदा डायनामो डीडी डॉक्यूमेंट एसडीके का इस्तेमाल करने वाले किसी भी व्यक्ति को मदद करने के लिए शामिल करें)

नए दस्तावेज़ क्लाइंट के लिए पूर्ण दस्तावेज यहां देखे जा सकते हैं: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html


मैं भी इस के साथ संघर्ष कर रहा हूँ मुझे पता चला कि वास्तव में 2 एपीआई के लिए डायनेमो डीडीबी है

AWS.DynamoDB

AWS.DynamoDBDocumentClient

आप की तरह, मैं एडीडी फ़ंक्शन का काम नहीं कर सका। मैंने डायनामो डीडीबी एपीआई के बजाय डायनेमो डीडीडीडीबी एपीआई को आयात और उपयोग करने का प्रयास किया। यह मेरे लिए समस्या का हल किया नीचे मेरा कोड स्निपेट है जो डायनेमो डीडी एपीआई के साथ काम करता है, लेकिन डायनेमो डीडीडीडीकॉलएपीटीएपी के साथ नहीं। मैं एक संख्या सेट के बजाय स्ट्रिंग सेट का उपयोग करता हूं, लेकिन मुझे लगता है कि इससे कोई फर्क नहीं पड़ेगा

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) { ….}




aws-lambda