2017-01-05 2 views
0

Я конвертирую фильтры из клиента в QueryImpl, используя метод setQueryObject. Когда я пытаюсь добавить еще один сложный критерий для этого запроса, мой исходный запрос переносится в поле с именем baseQuery, а новые критерии - это поле запроса. Когда запрос выполняется, используются только новые критерии, а baseQuery не используется. Это происходит только тогда, когда клиентский запрос отформатирован следующим образом: {"$ or": [{"field1": {"$ regex": "value1", "$ options": "i"}}, ...] } , и новые критерии форматируются таким же образом (что означает $ или операция). Кажется, что когда я пытаюсь объединить 2 $ или запросы, это происходит, но когда я объединяю $ или с $, и он правильно связывает запросы. Я использую это неправильно или это настоящая ошибка? Edit: Код:Morphia - Слияние сложного запроса с комплексными критериями

public static List<Entity> getData(client.Query query) { 
QueryImpl<Entity> finalQuery = Morphia.realAccess().extractFromQuery(Entity.class,query); 
finalQuery.and(finalQuery.or(finalQuery.criteria("field").equal(false), finalQuery.criteria("field").doesNotExist())); 
return finalQuery.asList(); 
} 

public <E> QueryImpl<E> extractFromQuery(Class<E> clazz, client.Query query) { 
    QueryImpl<E> result = new QueryImpl<E>(clazz,this.db.getCollection(clazz),this.db); 
result.setQueryObject(query.getFiltersAsDBObject); 
return result; 
} 
+0

Можете ли вы добавить соответствующий код морфии в сообщение? – Veeram

+0

Конечно, будет в нескольких минусах –

ответ

0

QueryImpl и setQueryObject() внутренние конструкции. Вы действительно не должны использовать их, поскольку они могут измениться или исчезнуть без предупреждения. Для создания документа запроса вы должны использовать API построителя запросов.

+0

Я попытался использовать общедоступный API запросов, но не нашел способ преобразовать запрос dbobject в запрос Morphia без метода setQueryObjext. Вы знаете способ преобразования dbobject в запрос или cirteria? Как мне его решить? –

+0

Вы не использовали бы «DBObject» для построения запроса. Вы должны использовать API Morphia напрямую. – evanchooly

+0

Я использую платформу воспроизведения. Я получаю запрос с клиентской стороны как DBObject. Как я могу использовать API морфий? –

0

У меня такая же проблема, кажется, работает, когда я это делаю: finalQuery.and(); finalQuery.and (finalQuery.or (finalQuery.criteria ("field"). Equal (false), finalQuery.criteria ("field"). DoesNotExist())); Это отвратительно и хотелось бы услышать, если у кого-то есть другой подход, но единственным способом, который я смог найти для преобразования данных с клиентской стороны, который является DBObject, является использование setQueryObject() QueryImpl.