Spring数据mongo在Query中使用OR

Posted

技术标签:

【中文标题】Spring数据mongo在Query中使用OR【英文标题】:Spring data mongo use OR in Query 【发布时间】:2013-05-04 21:25:23 【问题描述】:

让我们看看是否有人可以帮助解决这个问题。

我想使用 Spring Data mongodb 的 Repository,并且我想使用 Query 注释来过滤查找值 A=10 or A=20

  @Query("A: 10, A:20")
  findById(int id);

很显然,"," 尝试做一个 AND,我需要一个 OR。

有什么想法吗?

【问题讨论】:

【参考方案1】:

或者,如果您使用的是 Criteria API

Criteria criteria = new Criteria();
criteria.orOperator(Criteria.where("A").is(10),Criteria.where("B").is(20));
Query query = new Query(criteria);

mongoOps.find(query, <Yourclass>.class, "collectionName");

【讨论】:

【参考方案2】:

我认为这可能有效

@Query("'$or':[ 'A':10, 'B':20 ] ")

【讨论】:

@FakeUser @Query("$or : ['type':?0,'key':?1,'username':?2]") 是这是正确的查询吗? @mahendrakawde 查询对于通过typekeyusername 进行搜索是正确的【参考方案3】:

你可以像这样使用 Spring Data MongoDB:

Query query = new Query();
query.addCriteria(
    Criteria.where("").orOperator(
        Criteria.where("A").is(10),
        Criteria.where("B").is(20)
    )
);

mongoTemplate.find(query, YourClazz.class, "CollectionName");

【讨论】:

【参考方案4】:

您可以在 Spring Java 中使用 $in 运算符:

Criteria criteria = Criteria.where("field").in(listOfOptions);

【讨论】:

【参考方案5】:

除了 helloJava 答案,如果您已经有其他条件的查询,您可以直接在 query.addCriteria 上添加 orOperation,如下所示。

query.addCriteria(new Criteria().orOperator(Criteria.where("fieldA").is(value),
                Criteria.where("fieldB").is(value2)));

【讨论】:

【参考方案6】:

您可以为此使用$in 运算符。我不知道 Java Spring,但是以您的示例为例,Query 部分应如下所示:

@Query("A: $in: [10, 20]")

【讨论】:

谢谢,但是注释结构在 Spring 数据存储库中不起作用,请其他人有其他想法?【参考方案7】:

使用 Spring 的 BasicQuery:

DBObject queryCondition = new BasicDBObject();        
BasicDBList values = new BasicDBList();
values.add(new BasicDBObject("A", 10));
values.add(new BasicDBObject("B", 20));
queryCondition.put("$or", values);
Query query = new BasicQuery(queryCondition);
mongoTemplate.find(query, clazz);

【讨论】:

请注意,这个结构除了创建的对象更少之外,如果您想从 OR 运算符中排除 NULL 条件,也很方便。 无法解析构造函数'BasicQuery(com.mongodb.DBObject)'【参考方案8】:
Query query = new Query();  
Criteria criteria = new Criteria();  
criteria.orOperator(Criteria.where("category").is("your_Value_Category"), 
    Criteria.where("parentCategory").is("your_Value_ParentCategory"));
query.addCriteria(criteria);
mongoTemplate.find(query, YourPersistenceClass.class);

【讨论】:

【参考方案9】:

可以使用 Spring 的 Query 结构:

Query query = new Query();
query.addCriteria(Criteria.where("id").is(10).orOperator(Criteria.where("id").is(20));
this.client.findOne(query, clazz);

【讨论】:

它不会起作用,因为使用上面,一个 id 已经固定,并且在那个基本子句中 or 将被应用。但是 OP 希望有一个直接的第一级 Or 子句。 我们可以申请 orOperator 几个条件吗?

以上是关于Spring数据mongo在Query中使用OR的主要内容,如果未能解决你的问题,请参考以下文章

mongo中的高级查询之聚合操作(distinct,count,group)与数据去重

spring data mongo使用小记

spring-data-mongo - 可选查询参数?

Spring数据mongodb存储库语法中的@Query注释

让Mongo在Spring中跑起来

Spring Boot 和 Mongo - 如何通过嵌套属性进行查询