MongoTemplate 排序不适用于 LocalDateTime

Posted

技术标签:

【中文标题】MongoTemplate 排序不适用于 LocalDateTime【英文标题】:MongoTemplate Sorting isn't working for LocalDateTime 【发布时间】:2021-12-28 14:56:58 【问题描述】:

我有一个带有 Java 16 + GraphQL + Mongo 的 SpringBoot 应用程序。 我正在尝试通过某些属性查找所有记录,这些记录可能恰好为 NULL。 此外,我正在尝试实现分页和排序,只要我使用 Mongo/JPA 就可以像魅力一样工作。 然后我不得不退后一步,转移到 MongoTemplate,以便根据传递的填充属性创建自定义标准。现在什么都没有正常工作。

我的文档

@Data
@Document(collection = "user")
@AllArgsConstructor(access = AccessLevel.PUBLIC)
@NoArgsConstructor
@Builder
public class UserDocument 

    @Id
    private String id;

    private String name;
    private String email;
    private LocaleDateTime createdAt;

我的仓库

@Repository
public interface UserRepository 

    Page<UserDocument> findUsersByProperties(String name, String email, Pageable page);

我实现我的 Repo 的类

    @Repository
    public class UserCustom implements UserRepository 
    
        @Autowired
        MongoTemplate mongoTemplate;
    
        public Page<UserDocument> findUsersByProperties(String name, String email, Pageable page) 
            final Query query = new Query().with(page);
            final List<Criteria> criteria = new ArrayList<>();
    
            if (name != null && !name.isEmpty()) 
                criteria.add(Criteria.where("name").is(name));
            
            if (email != null && !email.isEmpty()) 
                criteria.add(Criteria.where("email").is(email));
            
            
    
            List<UserDocument> users = mongoTemplate.find(query, UserDocument.class);
    
            return PageableExecutionUtils.getPage(users, page,
                    () -> (long)users.size());
        
   

我调用这个方法并设置Pageable的代码

Pageable pageable = PageRequest.of(skip == 0 ? skip : skip/first, first).withSort(Sort.by(Sort.Direction.DESC,"createdAt"));
Page<UserDocument> result = userRepository.findUsersByProperties(name, email, pageable);
List<UserDocument> contentsResult = result.getContent();

会发生什么

    排序不是排序:在第二页中,它从第一页返回许多记录。 LocalDateTime 有问题吗?我查了一下,确实不应该。我试着做

    query.with(Sort.by(Sort.Direction.DESC,"createdAt"));

但结果相同。

    分页不完整,它总是说返回的页面是第一个也是最后一个,hasNext() 和 hasPrevious() 总是返回 false,但在数据库中我有数千个符合条件的条目。 MongoTemplate 是否有机会将 Slice 作为返回类型?无需从 List -> Page -> Slice 投射

调试时,查询对象已经正确设置了skip、first和sort属性,但是结果(至少是排序)是错误的。仍然当我告诉跳过 40 并取前 80 时,这些逻辑似乎是正确的。

我真的不知道我错过了什么,或者它是否是 MongoTemplate 的一种限制(这对我来说是新的)。提前感谢您提供任何提示或想法!

【问题讨论】:

【参考方案1】:

我建议调查spring-boot-starter-data-search。

将启动器添加到您的 pom 文件中:
<dependency>
    <groupId>app.commerce-io</groupId>
    <artifactId>spring-boot-starter-data-search-mongodb</artifactId>
    <version>1.1.0</version>
</dependency>
启用搜索存储库:
@Configuration
@EnableMongoRepositories(repositoryBaseClass = SearchRepositoryImpl.class)
public class MyConfiguration 

让您的存储库扩展“SearchRepository”
@Repository
public interface UserRepository extends SearchRepository<UserDocument, String> 

使用此存储库获取您的数据
String search = "name: myName and email: myEmail";
Page<UserDocument> result = userRepository.findAll(search, pageable);

您可以找到 MongoDB here的演示


免责声明:我是 spring-boot-starter-data-search 的贡献者

【讨论】:

以上是关于MongoTemplate 排序不适用于 LocalDateTime的主要内容,如果未能解决你的问题,请参考以下文章

CSS模块不适用于反应组件

使用 Spring Boot 和 MongoTemplate 对 MongoDB 结果进行排序

为啥排序不适用于矢量?

如何使用spring MongoTemplate查询子文档,并按子文档的某个字段排序?

为啥这种方法不适用于通过反应可视化快速排序?

排序不适用于我的热图