2017-05-03 122 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