【问题标题】:Spring data mongo use OR in QuerySpring数据mongo在Query中使用OR
【发布时间】:2023-04-03 16:53:01
【问题描述】:

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

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

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

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

有什么想法吗?

【问题讨论】:

    标签: java spring mongodb spring-data


    【解决方案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 几个条件吗?
              猜你喜欢
              • 1970-01-01
              • 2021-07-20
              • 1970-01-01
              • 2020-07-28
              • 2019-05-24
              • 1970-01-01
              • 1970-01-01
              • 2013-06-04
              相关资源
              最近更新 更多