如何在MongoDB中用Java执行带有AND和OR子句的查询?

o2rvlv0m  于 2022-11-28  发布在  Go
关注(0)|答案(1)|浏览(172)

我想使用Java Driver 3.2在MongoDB 3.2中执行查询,其中同时包含$and$or子句。
对于reference,我尝试了以下方法:

List<Document> criteria1 = new ArrayList<>();
List<Document> criteria2 = new ArrayList<>();

criteria1.add(new Document("fetchStatus", new Document("$gte", FetchStatus.PROCESSED_NLP.getID())));
criteria1.add(new Document("fetchStatus", new Document("$lte", fetchStatusParam)));
criteria1.add(new Document("episodeID", new Document("$in", episodeIDs)));

criteria2.add(new Document("fetchStatus", new Document("$eq", PROCESSED_FETCH.getID())));
criteria2.add(new Document("isFullTextRet", new Document("$eq", false)));

BasicDBList or = new BasicDBList();
or.add(criteria1);
or.add(criteria2);

DBObject query = new BasicDBObject("$or", or);
ArrayList<Document> results = dbC_Coll.find(query).into(new ArrayList<>());

criteria1criteria2应与$or连接的情况下,在criteria1子句中,应应用$and
问题是在MongoDB Java驱动程序3.2中没有这样的方法,我得到了Cannot resolve method find(com.mongodb.DBObject)错误。
如何在MongoDB Java驱动程序3.2中编写诸如(A && B) || (X && Y)之类的查询?

o7jaxewo

o7jaxewo1#

就我个人而言,我发现构造对象序列要容易得多,就像U使用JSON结构来增强可读性一样。但无论您看到{}还是[],它仍然只是Document()

Document query = new Document(
    "$or", Arrays.asList(
        // First document in $or
        new Document(
            "fetchStatus", 
            new Document( "$gte", FetchStatus.PROCESSED_NLP.getID() )
            .append("$lte", fetchStatusParam)
        )
        .append("episodeID", new Document( "$in", episodeIDs)),
        // Second document in $or
        new Document("fetchStatus", PROCESSED_FETCH.getID())
        .append("isFullTextRet", false)
    )
);

这基本上与以下内容相同:

{
       "$or": [
           {
               "fetchStatus": { 
                   "$gte": FetchStatus.PROCESS_NLP.getID(),
                   "$lte": fetchStatusParam
               },
               "episodeID": { "$in": episodeIDs }
           },
           {
               "fetchStatus": PROCESSED_FETCH.getID(),
               "isFullTextRet": false
           }
       ]
   }

此外,也不需要“显式”$eq运算符,因为“equals”实际上是查询属性中赋值的默认含义。

相关问题