DynamoDB查询包含Node.js数组中的一个值

时间:2017-07-08 21:23:20

标签: javascript node.js amazon-dynamodb

是否可以使用数组[apple, orange]查询类别(也是数组。显示如下)并获取数据包含appleorange的值?

row1 | "category": [apple, orange, banana, watermelon]
row2 | "category": [banana, watermelon]
row3 | "category": [orange, watermelon]

我希望得到row1, row3,其中包含appleorange

2 个答案:

答案 0 :(得分:5)

您可以使用 CONTAINS 功能检查列表中的值。但是,如果要检查多个值,则需要对每个值使用逻辑OR条件

  

列表支持CONTAINS:评估" a CONTAINS b"," a"   可以是一个清单;然而," b"不能是集合,地图或列表。

示例: -

var params = {
    TableName : 'tableName',
    FilterExpression: "contains (category, :category1) OR contains (category, :category2)",
    ExpressionAttributeValues : {   
        ':category1' : "apple",
        ':category2' : "orange"
    }
};

注意: -

我假设你要使用Scan API。如果您使用的是查询API,请添加KeyConditionExpression

答案 1 :(得分:0)

该问题询问了Query,但似乎还不清楚是否在Scan上使用了该技术。我将为每个部分回答。

  1. Scan非常昂贵,应尽可能使用QueryScan轻松支持使用contains来完成您要求的操作。

    await db.scan({
      TableName : 'tableName',
      FilterExpression: "contains (category, :category1) OR contains (category, :category2)",
      ExpressionAttributeValues : {   
        ':category1' : "apple",
        ':category2' : "orange"
      }
    }).promise();
    
  2. 鉴于Scan效率低下,最好有一个策略,其中可以使用Query返回表中的行。 Query 不支持Contains语法,并且必须仅运行单个HASH值。具有不同HASH值的两个不同行不能在同一Query中返回。假设满足此条件,则需要构建自定义索引。有两种方法可以执行此操作,具体取决于您拥有的类别数以及是否可以分配多个类别以到达行。每行1个猫,一个索引列即可工作。否则,我们将需要构造一个索引列以使用其他运算符之一。
    该列将需要为该行的所有类别包含一个复合值,例如对于所有可能的类别都为f(column_value, category_value_check) = true。为了构造这样的复合值,Amazon建议使用Z-Index