首页 > 解决方案 > 如何为mongoDB中的子文档编写具有多个或条件的条件查询

问题描述

我正在尝试为其中包含子文档的文档编写条件查询。我想查询文档的项目和带有一些和多个或条件的子文档。以下是我的文档结构

public class ParentEntity {
@Id
private String id;
private String sName;
private String itemDesc;
private String localTimeStamp;
private boolean isStatus;
private List<ChildEntity> childEntity;
private List<String> itemList;
}   

public class ChildEntity{

private String prc;
private LocalDate effDate;
}

现在我想查询一个满足以下条件的条件

  1. 如果 isStatus 为真,我们将获取

  2. 如果 effDate 是今天,我们将获取。

  3. 如果 localTimeStamp= null 或 localTimeStamp 为空或 mongoDb 集合中不存在 localTimeStamp 字段,我们将获取

    so in one expression  the condition is 1 and (2 or 3)
    

下面是我的代码我所做的

Criteria criteria = new Criteria();
Query query = new Query();
criteria.add("isStatus").is(true);
criteria.andOperator(criteria.orOperator(Criteria.where("childentity.effDate").is(LocalDate.now),Criteria.where("localTimeStamp").is("");
query.addCriteria(criteria);
List<ParentEntity> list = mongoTemplate.find(query,ParentEntity.class);

当 isStatus 为 true 且 effDate 为今天且 localTimeStamp 为 "" 时,这给了我结果,但我还想检查 localTimeStamp=null 和 localTimeStamp 归档文件中不存在。

我如何将 3 或 s 包含在一个和运算符的单个条件中?有人帮助我,我是 mongoDb 的新手。

标签: mongodbjava-8mongodb-queryspring-data-mongodbcriteria

解决方案


我建议调查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 = "address.name: myName or email: myEmail and (address.country: FR and address.city: Paris)";
Page<UserDocument> result = userRepository.findAll(search, pageable);

您可以在此处找到 MongoDB 的演示


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


推荐阅读