Как выполнять запросы с предложениями AND и OR в MongoDB с помощью Java?

Я хочу выполнить запрос в MongoDB 3.2 с помощью Java Driver 3.2, который одновременно содержит предложения $and и $or.

Используя ссылку, я попробовал следующий подход:

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<>());

Где criteria1 и criteria2 должны быть связаны с $or, а в пункте criteria1 следует применять $and.

Проблема в том, что в MongoDB Java Driver 3.2 такого метода нет, и я получаю ошибку Cannot resolve method find(com.mongodb.DBObject).

Мой вопрос:
Как составить такой запрос, как (A && B) || (X && Y), в MongoDB Java Driver 3.2?


person Mike B.    schedule 20.04.2016    source источник


Ответы (1)


Лично я нахожу гораздо менее запутанным построение последовательностей объектов, как U, со структурой JSON для повышения удобочитаемости. Но это по-прежнему просто Document() везде, где вы видите {}, и List везде, где вы видите []:

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, поскольку «равно» в любом случае является значением по умолчанию для присвоения значения в свойстве запроса.

person Neil Lunn    schedule 20.04.2016