2015-06-22 96 views
0

我試圖把這個成嗎啡查詢:MongoDB的嗎啡elemMatch API

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

所以我必須:

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

並在此之後,我不知道如何完成查詢,仍然使用在(),gte()方法中支持的FieldEnd,而無需使用BasicDBObjects自己編寫完整的查詢。

請幫助我將以上查詢轉換爲儘可能好的Morphia等價物。

編輯: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

是的,這是備份計劃。希望能夠通過Morphia來實現。 – Steinkauz