Amazon DynamoDB 查询包含子字符串的键的项目

37

我正在使用亚马逊的DynamoDB数据库,有一个列表包含各种字符串作为键。 我想查询键中包含子字符串的项目。例如,如果一些键如下:

"abcd_aaa"
"abcd_bbb"
"abcd_ccc"

我想要查询包含"abcd"的键,这3个项目将被返回。 是否可能实现?


2
我假设您所说的“query”,指的是实际的DynamoDB Query操作? - mkobit
2个回答

37

你只能使用相等操作符(EQ)查询hashKey。也就是说,如果这些值("abcd_aaa"、"abcd_bbb"、"abcd_ccc")属于你的hashKey,那么你必须完整提供它们。另一方面,Query操作允许在rangeKey上进行部分匹配,并提供了一些额外的比较操作符选项:

EQ | LE | LT | GE | GT | BEGINS_WITH | BETWEEN

查看 文档 以获取更多详细信息。

一种可能的方式是使用hashKey和rangeKey,其中您代码的第一部分将是hashKey,最后一部分是rangeKey。例如:

hashKey : abcd
rangeKey : aaa

当您按hashKey(abcd)查询时,通过这样做,您将收到所有三个记录,以rangeKey排序。


扫描虽然可行,但在这种情况下不具备成本效益。 - Mingliang Liu
2
DynamoDB最佳实践详细介绍了如何将分层值构建为排序键,如果您需要将超过两个值作为键。https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-sort-keys.html - aumbadgah
1
很遗憾,该文档没有提供如何回答OP问题的示例。当您说“一种可能是使用hashKey和rangeKey,其中代码的第一部分将是hashKey,最后一部分将是rangeKey,例如”时,这在运行查询方面意味着什么?您设置“rangeKey EQUALS aaa”,它就像包含一样吗?我不明白您的示例如何返回“按rangeKey排序的所有三个记录”。 - Kappacake

-5

扫描将会起作用

类似这样的东西

var params = {
      TableName: "TABLE",
      ScanFilter: {
           "id": {
                ComparisonOperator: "CONTAINS",
                AttributeValueList: ["abcd"]
           }
      }
 };

 var template = null;
 ddb.scan(params, function (err, data) {
      if (err) {
           console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
      } else {
           //console.log("Query succeeded.");
           data.Items.forEach(function (item) {
                console.log(item);
           });
      }
 });

30
扫描操作可能“可以工作”,但是需要消耗容量单位来获取整个表的内容并在之后进行过滤。从性能和成本的角度来看,这种方式非常低效,我认为应该在回答中强调这一点。 - JHH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接