Сложный запрос в Morphia

в моем методе Java я хотел бы передать в качестве параметра моей коллекции MongoDB сложный запрос, подобный этому:

{"$or": [{"$and": [{"contextID": "AKKA"}, {"messageID": "PIPPO"}]},
         {"$and": [{"domain": "Niguarda"}, {"hostName": {"$ne": "hostServer"}}]}
        ]
}

Строка, содержащая запрос, является переменной и передается в качестве параметра в строке запроса.

Я попытался передать запрос в качестве параметра критериям метода

(queryDB.criteria("
    {"$or": [
        {"$and": [{"contextID": "AKKA"}, {"messageID": "PIPPO"}]},
        {"$and": [{"domain": "Niguarda"}, {"hostName": {"$ne": "hostServer"}}]}]
    }"
) 

Но это не работает.

Какие-либо предложения?


person user2661044    schedule 07.08.2013    source источник
comment
Можете пояснить, что вы подразумеваете под неработающим. Это ошибка? Если да то в чем ошибка. Разве это не дает ожидаемого результата? Если нет, то какая разница.   -  person Simon Martin    schedule 07.08.2013
comment
Результат тот же, что я получаю с пустым запросом   -  person user2661044    schedule 07.08.2013
comment
Важно: параметр критерия передается переменной String.   -  person user2661044    schedule 07.08.2013


Ответы (2)


То, что вы пытаетесь сделать, было бы

Query q = dao.createQuery();
q.or(
 q.and(new Criteria[]{ dao.createQuery().filter("contextID").equal("AKKA"),
                       dao.createQuery().filter("messageID").equal("PIPPO") }),
 q.and(new Criteria[]{ dao.createQuery().filter("domain").equal("Niguarda"),
                       dao.createQuery().filter("hostname").notEqual("hostServer") })
);
person Joe Minichino    schedule 07.08.2013
comment
невозможно для меня. Запрос динамический, т.е. передается в код по параметру. - person user2661044; 07.08.2013
comment
Можете ли вы отредактировать вопрос, чтобы отразить этот последний сделанный вами комментарий? что не так с фильтром( dynamicParam ).equal( dynamicParam2 ) и т.д.? - person Joe Minichino; 07.08.2013
comment
Структура запроса является переменной. - person user2661044; 07.08.2013
comment
... Запрос может быть простым запросом или составным сложным запросом (с $or, $and, $gte и т.д....) - person user2661044; 07.08.2013
comment
Ты знаешь другой способ? Возможно, используя этот код: String s = {$query:{\$and\:[{\ipAddress\:\10.100.203.120\},{\contexID\:\AKKA\}]}}; DBObject dbObjQuery = (DBObject) JSON.parse(s); strOut = strOut.append(dbCollection.find(dbObjQuery).count()); - person user2661044; 07.08.2013
comment
Вы можете программно составить запрос, как показано в ответе. - person Joe Minichino; 07.08.2013
comment
Мне кажется, что вы используете родной драйвер, а не морфий, как вы сказали в заголовке. - person Joe Minichino; 07.08.2013
comment
Вторая попытка использовать родной драйвер. Но вопрос тот же. Неизвестный запрос для отправки. Я не знаю априори структуру, операторы... Я хотел бы в своем методе передавать запрос по мере его получения методом без перевода кода. - person user2661044; 07.08.2013
comment
Не важно использовать morphia или родной драйвер. Важно избегать перевода в коде. - person user2661044; 07.08.2013
comment
Что вы имеете в виду перевести в код? Если вас беспокоит проблема производительности, поскольку Morphia использует собственный драйвер Java, совместное использование morphia и драйвера Java не влияет на производительность. - person Trisha; 11.08.2013

Теперь это код (работает нормально, но я отказался от морфия):

public long count(String query) throws Exception {
    DB db = mongoClient.getDB(mongoDBName);
    DBCollection dbCollection = db.getCollection(mongoDBCollection);

    DBObject dbObjQuery;

    long l = 0;
    try {

        if (!(query == null)) {
            dbObjQuery = (DBObject) JSON.parse(query);
            l = dbCollection.find(dbObjQuery).count();
        } else {
            l = dbCollection.find().count();
        }


    } catch (Exception e) {

    } finally {

    }

    return l;

}

Есть другой способ сделать это с морфием?

person user2661044    schedule 09.08.2013
comment
Я не думаю, что вы сможете создать динамический запрос с Morphia, не сделав что-то вроде отражения. Однако, если вы покажете класс Java запрашиваемого объекта, это может помочь нам найти решение. - person Trisha; 11.08.2013
comment
Вам не нужно было сбрасывать морфию, вы также можете получить доступ к драйверу напрямую через морфию. - person Brill Pappin; 27.09.2013