2014-11-25 20 views
7

में एक गैर-कुंजी विशेषता पर एकाधिक क्वेरी फ़िल्टरों को संयोजित करना इस साल की शुरुआत में अमेज़ॅन announced गैर-महत्वपूर्ण विशेषताओं पर क्वेरी फ़िल्टर का समर्थन।AWS DynamoDB - जावा

क्या शर्तों को एक विशेषता मान पर जोड़ा जा सकता है? उदाहरण के लिए, इस परिदृश्य में मैं उन सभी आइटमों को पुनर्प्राप्त करना चाहता हूं जो एकल 'गैर-कुंजी' कॉलम में मानों की एक निश्चित सूची से मेल नहीं खाते हैं।

उनके दस्तावेज़ में कहा गया है कि प्रत्येक स्थिति केवल NOT_EQUALS या BEGINS_WITH जैसी तुलनाओं के लिए एक विशेषता मान रख सकती है। निम्नलिखित इसलिए काम नहीं करता:

HashMap<String, Condition> queryFilter = new HashMap<String, Condition>(); 

List<AttributeValue> AttributeValues = new ArrayList<AttributeValue>(); 
AttributeValues.add(new AttributeValue().withS("someValue1")); 
AttributeValues.add(new AttributeValue().withS("someValue2")); 

Condition attributeCondition = new Condition() 
    .withComparisonOperator(ComparisonOperator.NE) 
    .withAttributeValueList(AttributeValues); 

queryFilter.put("COLUMN_1", attributeCondition); 

DynamoDBQueryExpression<Item> queryExpression = new DynamoDBQueryExpression<Item>() 
    .withHashKeyValues(itemKey) 
    .withQueryFilter(queryFilter) 
    .withLimit(pPageSize); 

यह केवल IN तुलना ऑपरेटर की तरह लग रहा विशेषता मान की एक सूची रख सकते हैं। आदर्श रूप से इन स्थितियों को श्रृंखला योग्य होना चाहिए? चूंकि क्वेरी फिल्टर एक हैश नक्शा है हम उसी स्तंभ पर एक से अधिक की स्थिति नहीं डाल सकते (मैं कोशिश की है):

Condition c1 = new Condition() 
    .withAttributeValueList(new AttributeValue().withS("someValue1")) 
    .withComparisonOperator(ComparisonOperator.NE); 

Condition c2 = new Condition() 
    .withAttributeValueList(new AttributeValue().withS("someValue2")) 
    .withComparisonOperator(ComparisonOperator.NE); 

DynamoDBQueryExpression<Item> queryExpression = new DynamoDBQueryExpression<Item>() 
    .withHashKeyValues(itemKey) 
    .withConditionalOperator(ConditionalOperator.AND) 
    .withQueryFilterEntry("COLUMN_1", c1) 
    .withQueryFilterEntry("COLUMN_1", c2) 
    .withLimit(pPageSize); 
कोई मदद या स्पष्टीकरण

बहुत सराहना की जाएगी!

धन्यवाद

उत्तर

14

तो क्वेरी के लिए एक FilterExpression जोड़कर पता चला है यह संभव बनाया है

मैं DynamoDB documentation में यह देखा था लेकिन नवीनतम एडब्ल्यूएस को अपग्रेड नहीं किया था (यह blog post में हाल ही में शुरू) जावा एसडीके :(

मेरे ऊपर के उदाहरण का उपयोग करते हुए इस विचार करेंगे की तरह:

Map<String, AttributeValue> expressionAttributeValues = new HashMap<String, AttributeValue>(); 
expressionAttributeValues.put(":val1", new AttributeValue().withS("someValue1")); 
expressionAttributeValues.put(":val2", new AttributeValue().withS("someValue2")); 

DynamoDBQueryExpression<Item> queryExpression = new DynamoDBQueryExpression<Item>() 
    .withHashKeyValues(itemKey) 
    .withFilterExpression("COLUMN_1 <> :val1 AND COLUMN_1 <> :val2") 
    .withExpressionAttributeValues(expressionAttributeValues) 
    .withLimit(pPageSize); 

धन्यवाद ऐडवर्ड्स एस समर्थन!

+0

आपके प्रश्न का उत्तर पोस्ट करने के लिए समय निकालने के लिए धन्यवाद –

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