如何在 DynamoDB 查询操作上指定多个条件?

Sav*_*iya 5 javascript database node.js amazon-dynamodb

如何在 DynamoDB 查询操作上指定多个条件?

var params = {
            TableName: "liveTraining",
            KeyConditionExpression: "#ContentId = :contentId and #CompanyId = :companyId and #Status=:status",
            ExpressionAttributeNames:{
                  "#ContentId": "ContentId",
                  "#CompanyId": "CompanyId",
                  "#Status": "Status"
                },
            ExpressionAttributeValues: {
                ":contentId": contentId,
                ":companyId": companyId,
                ":status": 'Active'
                }
        };
        return new Promise((resolve, reject) => {
          dynamoDB.query(params, function (error, response) {
            if (error) {
              console.log('Unable to fetch data', JSON.stringify(error, null, 2));
            } else {
              console.log('fetched data', response);
            }
          })
        });
Run Code Online (Sandbox Code Playgroud)

当我使用 AND 运算符指定两个以上条件时,出现错误:

Unable to fetch data {
  "message": "Conditions can be of length 1 or 2 only",
  "code": "ValidationException",
  "time": "2019-04-12T06:53:34.766Z",
  "requestId": "MOE9FDN6I62NLROVPPTDMS5V2JVV4KQNSO5AEMVJF66Q9ASUAAJG",
  "statusCode": 400,
  "retryable": false,
  "retryDelay": 29.17802723976769
}
Run Code Online (Sandbox Code Playgroud)

小智 -1

您最多可以在 .txt 文件中为查询操作指定两个条件。任何进一步的条件都需要通过使用 的过滤器来应用。KeyConditionExpressionFilterExpression

每个查询操作至少需要一个分区键。您可以选择指定排序键。

允许KeyConditionExpression以下情况:

  1. 分区键上的等于运算符
  2. 排序键上可接受的运算符/操作

以下是可用于排序键的比较运算符的列表。

任何其他附加属性必须在FilterExpression. 请记住,KeyConditionExpresion尽管仅收到未经 过滤的内容,但您仍需为 所拾取的所有内容向 RCU 付费FilterExpression

来自与上面相同的链接,关于查询的消耗和过滤器:

过滤表达式在查询完成之后、结果返回之前应用。因此,无论是否存在过滤表达式,查询都会消耗相同的读取容量。

关于查询机制的AWS DynamoDB 查询文档很好地总结了这一点:

您必须提供分区键属性的名称以及该属性的单个值...使用参数为KeyConditionExpression分区键提供特定值...您可以选择通过指定排序键来缩小查询操作的范围中的值和比较运算符KeyConditionExpression。要进一步细化查询结果,您可以选择提供FilterExpression.