我正在使用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 :(得分: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));
}
});
我的数据:
<强>结果: - 强>
GetItem succeeded: {
"Items": [
{
"title": "Movie with map attribute",
"yearkey": 1991,
"records": {
"K3": "V3",
"K4": "V4",
"K1": "V1",
"K2": "V2"
}
}
],
"Count": 1,
"ScannedCount": 1
}