2015-06-02 6 views
8

डायनेमोडीबी के लिए नया और उपर्युक्त क्वेरी करने की आवश्यकता है, लेकिन यह सुनिश्चित नहीं है कि कैसे। यहां मैं वर्तमान में कोशिश कर रहा हूं, और मुझे नीचे त्रुटि मिल रही है।डायनेमो डीबी जावास्क्रिप्ट - प्राथमिक कुंजी और रेंज कुंजी की सरणी द्वारा क्वेरी?

Btw, मैं इस का उपयोग कर रहा जावास्क्रिप्ट पुस्तकालय डब्ल्यू/DynamoDB: https://github.com/awslabs/dynamodb-document-js-sdk

var ids = ['12313','12312313','12312313']; 
var params = { 
     TableName: 'apps', 
     IndexName: 'state-app_id-index', 
     KeyConditions: [ 
      DynamoDB.Condition("state", "EQ", "active"), 
      DynamoDB.Condition("id", "IN", ids) 
     ] 
    }; 

    DynamoDB.query(params, function(error, response) {}); 

इस प्रकार त्रुटि मैं हो रही है:

ValidationException: एक या अधिक पैरामीटर मान अमान्य हैं: ComparisonOperator IN L AttributeValue प्रकार

उत्तर

3

KeyConditionsका समर्थन नहीं करता हैऑपरेटर। KeyCondition के लिए दस्तावेज़ कहते हैं क्या ऑपरेटरों यह समर्थन करता है:

KeyConditions के लिए, केवल निम्नलिखित तुलना ऑपरेटरों समर्थित हैं:

EQ | LE | LT | GE | GT | BEGINS_WITH | BETWEEN

EQ ऑपरेटर केवल एक ही मूल्य के लिए काम करता है और साथ ही:

  • EQ: बराबर।

    AttributeValueList प्रकार स्ट्रिंग, संख्या, या बाइनरी (नहीं एक सेट प्रकार) का केवल एक ही AttributeValue हो सकते हैं। यदि किसी आइटम में अनुरोध में निर्दिष्ट एक से भिन्न प्रकार के एक विशेषता Value तत्व होता है, तो मान मेल नहीं खाता है। उदाहरण के लिए, {"S":"6"}{"N":"6"} के बराबर नहीं है। इसके अलावा, {"N":"6"}{"NS":["6", "2", "1"]} के बराबर नहीं है।

प्रतिबंध मूल रूप से KeyConditionExpression के लिए ही कर रहे हैं, जो नया है, कुंजी पर छानने के लिए जिस तरह से सिफारिश की। यहां प्रलेखन (जोर मेरा) से एक स्निपेट है:

स्थिति को एक हैश कुंजी मान पर समानता परीक्षण करना होगा। यह स्थिति एक एकल श्रेणी कुंजी मान पर कई तुलना परीक्षण में से एक को भी निष्पादित कर सकती है। क्वेरी उपयोग कर सकते हैं KeyConditionExpression को किसी दिए गए हैश और रेंज कुंजी मान, या कई आइटम नहीं हैं कि एक ही हैश कुंजी मान लेकिन अलग श्रेणी कुंजी मान

आपके मामले में साथ एक आइटम को पुनः प्राप्त करने के लिए, आप कर सकते थे को उसी तरह से बनाएं जैसा कि this answer में वर्णित है।

+1

मैं एक ही चीज़ के बाद हूं लेकिन आपके लिंक के अनुसार 'एक फ़िल्टर एक्स्प्रेशन मुख्य गुणों की अनुमति नहीं देता है। आप विभाजन कुंजी या सॉर्ट कुंजी के आधार पर फ़िल्टर अभिव्यक्ति को परिभाषित नहीं कर सकते हैं। तो वापस वर्ग एक पर। –

1

आईएन कथन का उपयोग करने का एकमात्र तरीका फ़िल्टर की स्थिति का उपयोग करना है। हालांकि फ़िल्टर अभिव्यक्ति में केवल गैर-प्राथमिक कुंजी विशेषताएं हो सकती हैं। इस प्रकार आप जिस क्वेरी को प्राप्त करना चाहते हैं वह प्राथमिक कुंजी के साथ संभव नहीं है। कुछ इस

var params = { 
    TableName: 'apps', 
    ... 
    FilterExpression: "#id IN (:one,:two)",: 
... 

जैसी गैर-प्राथमिक कुंजी के साथ ही संभव है विशेषताओं का

वैकल्पिक हल आप लागू बैच उपयोग कर रहा है कर सकते हैं एक कॉल और प्रत्येक स्थिति में एक क्वेरी मुद्दा गुणकों जारी करने की बजाय इसलिए item मिल आपके आईडी सरणी से एक मूल्य होगा।

जब बैच की बात आती है तो आइटम को पढ़ने की क्षमता इकाइयों (batch get item in node.js) से अवगत रहें।

संबंधित मुद्दे