Java MongoDB查询,插入2个 '$or'条件

标签 java mongodb

我正在尝试使用 Java 生成 MongoDB 查询,如下所示:

{
   "$or": [
      {
         "user": {
            "$exists": true
         }
      },
      {
         "parent": {
            "$exists":true
         }
      }
   ],
   "working": 1,
   "$or": [
      {
         "car.id": 3846,
         "car.mediaType": 1
      },
      {
         "car.matched.id": 3846,
         "car.matched.model": 1
      }
   ]
}

但我不能这样做,因为当添加第二个 $or 条件时,第一个条件会被覆盖。

我需要搜索每个$or的一些结果,我无法将其添加到同一个$or中。代码是:

import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.BasicDBObjectBuilder;

public class Sample {
    public function mongoSearch()
    {
        BasicDBObjectBuilder queryBuidlerType = BasicDBObjectBuilder.start().add("working", 1);

        BasicDBObject user = new BasicDBObject("user", new BasicDBObject("$exists", true));

        BasicDBObject parent = new BasicDBObject("parent", new BasicDBObject("$exists", true));

        BasicDBObject car = new BasicDBObject();
        parentMatch.put("car.id", mId);
        parentMatch.put("car.model", mModel);

        BasicDBObject carMatched = new BasicDBObject();
        parentMatch.put("car.matched.id", mId);
        parentMatch.put("car.matched.model", mModel);

        BasicDBList or1 = new BasicDBList();
        or.add(user);
        or.add(parent);

        BasicDBList or2 = new BasicDBList();
        or.add(car);
        or.add(carMatched);

        queryBuidlerType.add("$or", or1).add("$or", or2);

        DBObject queryType = queryBuidlerType.get();
    }
}

最佳答案

您应该使用 $and 包装 $or :

{
   "$and": [
    {"$or": [
          {
         "user": {
            "$exists": true
         }
          },
          {
         "parent": {
            "$exists":true
         }
          }
       ]},
       {"$or": [
          {
         "car.id": 3846,
         "car.mediaType": 1
          },
          {
         "car.matched.id": 3846,
         "car.matched.model": 1
          }
      ]}
    ],
   "working": 1
}

而且,我不知道你想做什么,但如果你想在同一个子对象中匹配“car.id”:3846”和“car.mediaType”:1,请考虑使用`$elemMatch

在 Java 中:

QueryBuilder queryBuidlerType = QueryBuilder.start("working").is(1);

DBObject or1 = QueryBuilder.start().or(QueryBuilder.start("user").exists(true).get(), QueryBuilder.start("parent").exists(true).get()).get();
DBObject or2 = QueryBuilder.start().or(QueryBuilder.start("car.id").is(mId).and("car.model").is("mModel").get(), QueryBuilder.start("car.matched.id").is(mId).and("car.matched.model").is("mModel").get()).get();

queryBuidlerType.and(or1, or2);

DBObject queryType = queryBuidlerType.get();

关于Java MongoDB查询,插入2个 '$or'条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33654970/

相关文章:

java - 如何部分更新/重新绘制 jpanel(背景内容不会再次绘制。它保持原样)

mongodb - 在内存中运行 MongoDB 是否会在 RAM 上创建重复项

javascript - MongoDB选择_id数组的位置?

java - 将破折号添加到 Java 正则表达式

Java 小程序安全警告复选框

java - 为什么 Java 类加载器找不到我的接口(interface)?

java - 我对何时使用抽象类或接口(interface)的理解

mongodb - 是否可以向 MongoDB 写入可区分的联合?

mongodb - 为什么 MongoDB 不再允许在空文档中使用 $set 和 $unset?

javascript - 如何在 Node 议程中以编程方式定义多个具有相同名称的作业