2015-09-25 6 views
14

मान लीजिए कि मैं DynamoDB में निम्नलिखित संरचना के साथ रिकॉर्ड भंडारण कर रहा हूँ करते हैं:क्या डायनामो डीबी में सशर्त पॉट या अपडेट करना संभव है?

  • अगर दिया id साथ रिकॉर्ड नहीं करता है:

    {  
        "id": "57cf5b43-f9ec-4796-9de6-6a50f556cfd8", 
        "created_at": "2015-09-18T13:27:00+12:00", 
        "count": 3 
    } 
    

    अब, यह एक अनुरोध में निम्नलिखित हासिल करना संभव है मौजूद है यह गिनती = 1

  • के साथ बनाया जाना चाहिए यदि id के लिए रिकॉर्ड मौजूद है तो काउंटर अपडेट किया जा रहा है।

वर्तमान में मैं अगर रिकॉर्ड मौजूद हैं और परिणाम के आधार पर मैं एक put या एक update कर जांच करने के लिए एक प्रश्न कर रहा हूँ। इसे एक ही ऑपरेशन में फोल्ड करना अच्छा लगेगा।

उत्तर

11

आप अपने उपयोग मामले के कारण UpdateItem एपीआई और UpdateExpression के साथ ऐसा कर सकते हैं। चूंकि count एक Number प्रकार यहाँ हो जाएगा, आप SET या ADD एक्सप्रेशन का उपयोग कर सकते हैं:

ADD के लिए दस्तावेज़ आपको बताता है कि आप Number प्रकार (जोर मेरा) के लिए उपयोग कर सकते हैं:

  • ADD - आइटम में निर्दिष्ट मान जोड़ता है, यदि विशेषता पहले से मौजूद नहीं है। विशेषता मौजूद है, तो जोड़ें के व्यवहार विशेषता का डेटा प्रकार पर निर्भर करता:

    • तो मौजूदा विशेषता एक संख्या है, और अगर मूल्य भी एक नंबर है, तो मूल्य गणितीय है मौजूदा विशेषता में जोड़ा गया। यदि मान एक नकारात्मक संख्या है, तो यह मौजूदा विशेषता से घटाया गया है।

    आप को बढ़ा या एक आइटम है कि अद्यतन करने से पहले अस्तित्व में नहीं है के लिए एक नंबर मूल्य घटती में जोड़े उपयोग करते हैं, DynamoDB प्रारंभिक मूल्य के रूप में 0 का उपयोग करता है। इसी प्रकार, यदि आप किसी मौजूदा आइटम के लिए ADD का उपयोग किसी विशेषता मान को बढ़ाने या घटाने के लिए करते हैं जो अद्यतन से पहले मौजूद नहीं है, तो DynamoDB प्रारंभिक मान के रूप में 0 का उपयोग करता है। उदाहरण के लिए, मान लीजिए कि जिस आइटम को आप अपडेट करना चाहते हैं उसके पास आइटमकाउंट नामक एक विशेषता नहीं है, लेकिन आप वैसे भी इस विशेषता में नंबर 3 को जोड़ने का निर्णय लेते हैं। डायनेमो डीबी आइटमकाउंट विशेषता बनाएगा, इसके प्रारंभिक मान को 0 पर सेट करेगा, और अंततः इसमें 3 जोड़ें। परिणाम 3.

अपने उदाहरण के लिए के एक मूल्य के साथ, आइटम में एक नया ITEMCOUNT विशेषता प्राप्त होगी, आप, 1 अपने UpdateExpressionADD #c :n, जहां :nNumber प्रकार का एक ExpressionAttributeValue है हो सकता था मान है, और #ccount के लिए प्रतिस्थापन है। आपको count के लिए प्लेसहोल्डर का उपयोग करने की आवश्यकता है क्योंकि यह reserved word है।

Modifying Items and Attributes with Update Expressions

7

पर अधिक उदाहरण देखें मुझे अपने सवाल में उल्लेख नहीं था कि मैं चाहता था countcreated_at को संशोधित किए बिना बाद की घटनाओं के लिए ऊपर जाना था। मेरा अंतिम कामकाजी अद्यतन इनपुट इस तरह दिखता है:

{ 
    Key: { 
    id: { 
     S: "some_unique_id" 
    } 
    }, 
    TableName: "test", 
    ExpressionAttributeNames: { 
    #t: "created_at", 
    #c: "count" 
    }, 
    ExpressionAttributeValues: { 
    :t: { 
     S: "2015-09-26T15:58:57+12:00" 
    }, 
    :c: { 
     N: "1" 
    } 
    }, 
    UpdateExpression: "SET #t = if_not_exists(#t, :t) ADD #c :c" 
} 
संबंधित मुद्दे