首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >条件DynamoDb查询

条件DynamoDb查询
EN

Stack Overflow用户
提问于 2017-03-08 02:54:29
回答 3查看 1.3K关注 0票数 0

我有一个名为Users的DynamoDb表。我正在尝试执行一个非常简单的查询,其中用户的姓氏类似于'John*‘(Johnson,Johnston,Johnny等),但是我找不到一个非常直接的示例。

下面是我的代码片段:

代码语言:javascript
复制
public class DynamoDbUsersTest extends ApplicationTest {
      @Autowired
      private DynamoDb dynamoDb;

      private Table usersTable = dynamoDb.getTable("Users");

      public void getUsersByLastNameContainsTest(){
          //userTable.contains(user.getLastName());  // No such method.
          userTable.scan(new ScanFilter("lastName").contains("John");
          ...
      }
}

有人能给我指个方向吗?我尝试查看Query对象,但我不确定它是否能完成我所需的工作。

我不得不使用Scan对象来完成这项工作,但是它会对每个查询执行全表扫描。有没有人找到一种更好/更快的搜索部分值的方法?下面的代码会更快吗?

代码语言:javascript
复制
public class DynamoDbUsersTest extends ApplicationTest {
      @Autowired
      private DynamoDb dynamoDb;

      private Table usersTable = dynamoDb.getTable("Users");

      public void getUsersByLastNameContainsTest(){
          userTable.query(new QueryFilter("lastName").contains("John");
          ...
      }
}
EN

回答 3

Stack Overflow用户

发布于 2017-03-08 11:00:44

子字符串匹配是ElasticSearch做得很好的一件事。我建议您打开您的DynamoDB表的流,并在AWS ElasticSearch集群中索引您的项目/文档。

票数 1
EN

Stack Overflow用户

发布于 2017-03-08 06:55:59

下面是使用contains部分匹配字符串的ScanSpec

代码语言:javascript
复制
Table table = dynamoDB.getTable("tablename");

        Map<String, Object> attributeValueMap = new HashMap<>();
        attributeValueMap.put(":lastNameValue", "John");

        ScanSpec scanSpec = new ScanSpec().withFilterExpression("contains (lastName,:lastNameValue)")
                .withValueMap(attributeValueMap);
        IteratorSupport<Item, ScanOutcome> scanOutcome = null;

        scanOutcome = table.scan(scanSpec).iterator();

while (scanOutcome.hasNext()) {
            System.out.println("Output ==============>" + scanOutcome.next().toJSON());
        }

编辑:-

正如在其他答案中提到的,如果您知道散列键,并且lastname未定义为散列键,则可以使用QuerySpec。此外,您只能在FilterExpression上使用contains。换句话说,它不能在KeyConditionExpression上使用。

QuerySpec需要KeyConditionExpression,它只支持哈希键属性上的相等运算符。然后在FilterExpression上,您可以对非键属性使用contains

票数 0
EN

Stack Overflow用户

发布于 2017-03-08 11:45:06

您不能将contains用作查询的一部分,而只能用作扫描;但是如果您只关心以特定值开头的结果,则可以使用begins_with查询操作符:begins_with (a, substr) (其中a是您的键名)。为此,键必须是排序键,而不是分区键。请参阅http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#QueryAndScan.Queryhttp://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryingJavaDocumentAPI.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42656061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档