2015-06-22 3 views
0

Я пытаюсь поставить это в морфий запрос:MongoDB Morphia elemMatch API

db.woot.find({ 
    "bar.tables": { 
     $elemMatch: { 
      "tableId": { 
       $in: [3, 
       4] 
      }, 
      "tab": { 
       $gte: 20000 
      } 
     } 
    } 
}) 

Так у меня есть:

Query<Table> q 
q.field("bar.table").hasThisElement() 

И после этого я не знаю, как закончить запрос и все еще используя FieldEnd, который поддерживает методы(), gte(), не записывая весь запрос самостоятельно с помощью BasicDBObjects.

Пожалуйста, помогите мне преобразовать вышеуказанный запрос в самый подходящий эквивалент Морфии.

EDIT: bar.tables - массив, поэтому сопоставление должно выполняться с помощью elemMatch, иначе оно может соответствовать первому условию из некоторого элемента и второго условия из другого элемента, но действительны только элементы, соответствующие обеим условиям.

+0

Для этого достаточно: ('bar.table.tableId' должно быть 3 или 4) и' bar.table.tab' должно быть больше 20,00 - правильно? – xeraa

+0

Да. Но обратите внимание, что это может быть и любой другой оператор или данные. Запрос строит поверх API, который определяет оператор и данные. – Steinkauz

ответ

0

Я хотел бы попробовать что-то вроде этого:

Query<Table> query = mongoDataStore.find(Table.class) 
    .field("bar.table.tableId").hasAnyOf(tableIdArrayList) 
    .field("bar.table.tab").greaterThan(20000); 

Вы, вероятно, потребуются некоторые пользовательские запросы строитель, где вы можете установить некоторые условия, и он будет затем собрать правильный запрос для вас - по крайней мере, наших подход.

+0

Наверное, я забыл упомянуть очень важную вещь. bar.table действительно должен быть bar.tables, поскольку это массив. Таким образом, вам нужно сопоставить элемент, иначе один элемент может удовлетворять первому условию, а другой - второму. Но один элемент должен удовлетворять обоим условиям, чтобы быть действительным результатом. – Steinkauz

+0

Я не думаю, что это возможно с Morphia - вам, вероятно, придется вернуться к драйверу Java и создать там поддокумент, см. Http://stackoverflow.com/a/29818539/573153 – xeraa

+0

Да, это резервная копия план. Однако надеялся добиться этого с Морфией. – Steinkauz