2017-05-03 95 views
0

我正在研究使用DynamoDB的應用程序。DynamoDB中的複雜查詢

有沒有一種方法可以創建具有多個屬性的GSI。我的目標是查詢表以下類型的查詢:

(attrA.val1 === someVal1 AND attrB.val2 === someVal2 AND attrC.val3 === someVal3) 
OR (attrA.val4 === someVal4 AND attrB.val5 === someVal5 AND attrC.val6 === someVal6) 

我知道我們可以用Query當我們有關鍵屬性,當關鍵屬性是未知的,我們可以使用Scan操作。如果我們需要使用非鍵屬性查詢,我也知道GSI。但在這種情況下我需要一些幫助。有沒有一種方法來模擬GSI以適應上述查詢。

+0

您的意思是,只有滿足上述條件時,才需要GSI上的物品?這與關於RDBMS的觀點非常相似。 – notionquest

+0

我想從我的dynamobd表中找到滿足上述條件的行。我不介意它是來自表格還是索引。但行應滿足條件。 –

回答

1

我在我的Movies表中有以下項目(即數據)。以下查詢params適合我。

您可以添加OP中存在的第三個屬性。它應該工作正常。

DynamoDB支持FilterExpression上的複雜條件。根據一些條件

查詢表: -

var table = "Movies"; 

var year_val = 1991; 
var title = "Movie with map attribute"; 

var params = { 
    TableName : table, 
    KeyConditionExpression : 'yearkey = :hkey and title = :rkey', 
    FilterExpression : '(records.K1 = :k1Val AND records.K2 = :k2Val) OR (records.K3 = :k3Val AND records.K4 = :k4Val)',  
    ExpressionAttributeValues : { 
     ':hkey' : year_val, 
     ':rkey' : title, 
     ':k3Val' : 'V3', 
     ':k4Val' : 'V4',   
     ':k1Val' : 'V1', 
     ':k2Val' : 'V2' 

    } 
}; 

docClient.query(params, function(err, data) { 
    if (err) { 
     console.error("Unable to read item. Error JSON:", JSON.stringify(err, 
       null, 2));  
    } else { 
     console.log("GetItem succeeded:", JSON.stringify(data, null, 2)); 

    } 
}); 

我的數據: -

enter image description here

結果: -

GetItem succeeded: { 
    "Items": [ 
    { 
     "title": "Movie with map attribute", 
     "yearkey": 1991, 
     "records": { 
     "K3": "V3", 
     "K4": "V4", 
     "K1": "V1", 
     "K2": "V2" 
     } 
    } 
    ], 
    "Count": 1, 
    "ScannedCount": 1 
} 
+0

完美無瑕。但我的問題在於;我如何建模我的Table或GSI,因爲我不知道我必須在「KeyConditionExpression」中匹配的值。我可以使用上面的示例並將我的查詢作爲過濾器表達式傳遞。但是,我仍然需要'KeyConditionExpression'。 –

+0

好吧,您還沒有在OP中提供任何關於您的整個模型的信息。 OP會詢問您是否可以使用DynamoDB編寫複雜的查詢。您必須提供所有相關屬性和查詢訪問模式,並詢問您如何設計GSI。 – notionquest