【问题标题】:Complex Queries in DynamoDBDynamoDB 中的复杂查询
【发布时间】:2017-05-03 20:20:58
【问题描述】:

我正在开发一个使用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 进行建模以适应上述查询。

【问题讨论】:

  • 你的意思是只有在满足上述条件的情况下才需要 GSI 上的项目?这与 RDBMS 上的视图非常相似。
  • 我正在尝试从我的 dynamobd 表中找出满足上述条件的行。我不介意它是来自表还是来自索引。但行应满足条件。

标签: amazon-web-services amazon-dynamodb


【解决方案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
}

【讨论】:

  • 完全没问题。但我的问题是;我不知道我必须在KeyConditionExpression 中匹配的值,因此如何为我的表或 GSI 建模。我可以使用上面的示例并将我的查询作为过滤器表达式传递。但是,我仍然需要KeyConditionExpression
  • 好吧,您没有在 OP 中提供有关您的整个模型的任何信息。 OP 只是询问您是否可以使用 DynamoDB 编写复杂的查询。您必须提供所有相关属性和查询访问模式,并询问如何设计 GSI。
猜你喜欢
  • 2013-06-28
  • 2020-04-06
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多