java - 对 Spring Data Mongo 存储库提供限制

标签 java mongodb mongodb-query spring-data spring-data-mongodb

使用最新的 Spring Data Mongo(撰写本文时为 2.1.1),如何指定获取“自定义”查询方法的第一条记录?这是一个例子:

@Query(value="{name: ?0, approval: {'$ne': null}}",
        sort="{'approval.approvedDate': -1}",
        fields = "{ _id: 1 }")
List<Item> getLatestApprovedIdByName(String name, Pageable pageable);

/**
 * Finds the id of the most recently approved document with the given name.
 */
default Item getLatestApprovedIdByName(String name) {
    return getLatestApprovedIdByName(name, PageRequest.of(0, 1)).stream()
                                                                .findFirst()
                                                                .orElse(null);
}

理想情况下,我可以仅使用 String 参数来注释 getLatestApprvedIdByName。

org.springframework.data.mongodb.repository.Query 注释上似乎没有限制字段。

这看起来很奇怪,因为我可以模拟命名方法所做的所有事情,除了 findFirst 之外。

如果没有Pageable,我会得到In CorrectResultSizeDataAccessException,并且返回List是 Not Acceptable ,因为我不想浪费时间返回任意大的结果,加上需要处理 0 或 1 项可能性的复杂代码。

最佳答案

由于您的查询返回多个文档,因此无法使其直接返回单个 Item

使用

// Repository
@Query(value="{name: ?0, approval: {'$ne': null}}",
        sort="{'approval.approvedDate': -1}",
        fields = "{ _id: 1 }")
Stream<Item> getLatestApprovedIdByName(String name);

// Service
default Item getLatestApprovedIdByName(String name) {
    return getLatestApprovedIdByName(name).stream().findFirst().orElse(null);
}

由于 Stream 的工作方式,您只能获取第一个查询结果,而不是整个结果集。欲了解更多信息,请参阅documentation .

使用PagePageable

// Repository
@Query(value = "{name: ?0, approval: {'$ne': null}}", fields = "{ _id: 1 }")
Page<Item> getLatestApprovedIdByName(String name, Pageable pageable);

// Service
default Item getLatestApprovedIdByName(String name) {
    PageRequest request = new PageRequest(0, 1, new Sort(Sort.Direction.DESC, "approval.approvedDate"));
    return getLatestApprovedIdByName(name, request).getContent().get(0);
}

通过使用PageRequest,您可以指定想要的结果数量以及排序顺序。基于this answer .

关于java - 对 Spring Data Mongo 存储库提供限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52975758/

相关文章:

mongodb - 如何使用Gorm(Mongo)保存嵌入式对象的ID字段

java - 使用以前的方法答案调用方法

java - 将 Java 表达式/公式转换为 Objective-C

java - 进行空检查的更好方法是什么?

java - Java HTTP 请求时出错

php - 法尔康。如何从 mongoClient/service 连接获取数据库名称

MongoDB 2.4 新的文本索引功能

mongodb - 在列表中显示mongo中的相应字段

mongodb - 在 MongoDB 中搜索多个集合

MongoDB $and 查询单个嵌入文档中的多个字段和值