2015-06-22 82 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