Amazon dynamodb 使用OR和beginsWith的DynamoDB查询

Amazon dynamodb 使用OR和beginsWith的DynamoDB查询,amazon-dynamodb,dynamodb-queries,amazon-dynamodb-index,Amazon Dynamodb,Dynamodb Queries,Amazon Dynamodb Index,首先,我知道我们不能在KeyConditionExpression中使用OR运算符。 我将我的I18n密钥存储在数据库中,我具有以下数据结构: { "de": "Key in German", "en": "Key in English", "pk_id": "I18N-12345" } 我还有一个UI,其中有一个文本字段,允许我按任何语言文本过滤键。在本例中为英语或德语,由键de和en表示 我想实现一个查询,其关键条件表达式如下所示: { KeyConditionExpres

首先,我知道我们不能在
KeyConditionExpression
中使用OR运算符。 我将我的I18n密钥存储在数据库中,我具有以下数据结构:

{
  "de": "Key in German",
  "en": "Key in English",
  "pk_id": "I18N-12345"
}
我还有一个UI,其中有一个文本字段,允许我按任何语言文本过滤键。在本例中为英语或德语,由键
de
en
表示

我想实现一个查询,其关键条件表达式如下所示:

{
  KeyConditionExpression: "begins_with(#de, :search_text) OR begins_with(#en, :search_text)"
}
如前所述,这将是理想的,但由于我们没有
操作,我真的不知道如何修改查询或如何创建允许我进行此查询的GSI


谢谢,您没有在示例中解释什么是分区键和排序键。不幸的是,每个表只能有一个排序键,而且只有该排序键才能像您那样使用
start_with()
函数进行有效筛选。而且不能让“en”和“de”都是同一个表的排序键


但是,您可以使用LSI来解决此限制。您可以让“en”作为原始表的排序键(我假设pk_id是分区键?),然后创建一个分区键相同(pk_id)但排序键为“de”的LSI(它甚至不需要是GSI-LSI更有效)。然后,您只需对每个查询执行两次—一次在基表上使用
以(#en,:search_text)开头,一次在LSI上使用`以(#de,:search_text)开头。您想要的“或”只是表示同时获取查询结果。

您没有解释示例中的分区键和排序键是什么。不幸的是,每个表只能有一个排序键,而且只有该排序键才能像您那样使用
start_with()
函数进行有效筛选。而且不能让“en”和“de”都是同一个表的排序键


但是,您可以使用LSI来解决此限制。您可以让“en”作为原始表的排序键(我假设pk_id是分区键?),然后创建一个分区键相同(pk_id)但排序键为“de”的LSI(它甚至不需要是GSI-LSI更有效)。然后,您只需对每个查询执行两次—一次在基表上使用
以(#en,:search_text)开头,一次在LSI上使用`以(#de,:search_text)开头。你想要的“或”只意味着同时获得querys的结果。

非常感谢你的解释。我认为这些信息足以让我解决这个问题。由于我们避免创建LSI,我想我将创建两个GSI并进行两个单独的查询。非常感谢。祝你好运我认为您不需要两个GSI—只需要一个GSI(其排序键为“de”)加上原始表(其排序键为“en”)。当然,如果您的原始表有不同的排序键(您没有提到),那么,是的,您可以使用两个GSI,一个在“de”上,另一个在“en”上。非常感谢您的解释。我认为这些信息足以让我解决这个问题。由于我们避免创建LSI,我想我将创建两个GSI并进行两个单独的查询。非常感谢。祝你好运我认为您不需要两个GSI—只需要一个GSI(其排序键为“de”)加上原始表(其排序键为“en”)。当然,如果原始表有不同的排序键(您没有提到),那么可以使用两个GSI,一个在“de”上,另一个在“en”上。