【问题标题】:How can I build an $or query for MongoDB using the Java driver?如何使用 Java 驱动程序为 MongoDB 构建 $or 查询?
【发布时间】:2012-05-24 03:32:20
【问题描述】:

我正在尝试或 MongoDB 中的某些条件(使用 Java 驱动程序)。这就是我正在做的:

Pattern regex = Pattern.compile("title");   
DBCollection coll = MongoDBUtil.getDB().getCollection("post_details");

BasicDBObject query = new BasicDBObject();
query.put("category_title", "myCategory");      
query.append("post_title", regex);  
query.append("post_description", regex);    

DBCursor cur = coll.find(query);
while(cur.hasNext()) {
    System.out.println(cur.next().get("post_id"));
}

我想在这些条件下使用$or 操作数,但我猜默认是“and”,我不知道如何更改它。在上面的代码中,如果其中一个条件返回null,结果也会是null

【问题讨论】:

标签: java mongodb mongodb-query mongo-java-driver


【解决方案1】:

您是正确的,在查询中指定多个字段的“默认”是每个字段都用作条件过滤器,因此是 AND 操作。

您可以使用具有以下语法的 $or 操作数使用 OR 子句执行 MongoDB 查询:

db.col.find({$or:[clause1, clause2]})

where 每个子句都可以是一个查询。 $or 不必是顶级操作数,但如果是 MongoDB 可以为每个单独的子句使用索引。

在您的示例中,您希望以这个查询结束:

db.col.find({$or:[{"post_title", regex}, {"post_description", regex}]});  

可以通过以下方式在Java中构造:

DBObject clause1 = new BasicDBObject("post_title", regex);  
DBObject clause2 = new BasicDBObject("post_description", regex);    
BasicDBList or = new BasicDBList();
or.add(clause1);
or.add(clause2);
DBObject query = new BasicDBObject("$or", or);

【讨论】:

  • thnx ,让我测试一下并取回 2 u 。 :)
  • 我在 MongoDB 3.2 中使用 Java 驱动程序 3.2.2 尝试了这种方法,但出现错误:Can't resolve the method dbColl.find(DBObject)。能否请您更新实际 Java 驱动程序版本的答案。
【解决方案2】:

使用filters,您可以像这样构建自己的:

import com.mongodb.client.model.Filters;
...

Bson filter = Filters.or(
                    Filters.eq("post_title", regex), 
                    Filters.eq("post_description", regex)
                  );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多