2014-01-24 43 views
0

我对Java很新。我对mongoDB非常陌生。使用morphia在mongodb中的对象列表内搜索

我有一个集合,它看起来是这样的:

{ 
    "_id" : "1234", 
    "name" : "bill", 
    "products" : [ 
     { 
      "fooType" : "bar", 
      ..... 
     }, 
     { 
      "fooType" : "oof", 
      ..... 
     }   
    ], 
    "status" : "Truncated" 
}, 
{...} 

我想实现一个搜索功能通过fooType进行搜索。我能够使用标准mongodb语法创建工作查询,但无法弄清楚如何使用morphia实现。

一个工作的MongoDB查询:

db.Clients.find({products: {$elemMatch: {fooType: "bar"}}}) 

,我已经没有任何成功尝试了一些(截)代码:

DatastoreImpl ds; 
q = ds.createQuery(Clients.class).field("products").hasThisElement("fooType"); 

显然,这并不工作,因为它期望的对象。我似乎无法围绕如何使用hasThisElement,我甚至不确定这是否是最好的方式去解决这个问题。

+0

你试过'ds.createQuery(Clients.class).field(“products.fooType”)。hasThisElement(“bar”)'? –

+0

同样的错误:'无效参数:预计一个对象($ elemMatch)' –

回答

3

hasThisElement期望参数中有一个对象,所以你不能使用字符串“fooType”或“bar”。

假设您有以下类此集合:

class Clients { 
String id; 
String name; 
List<Product> products = new ArrayList<Product>(); 
String status; 
} 

class Product { 
String fooType; 
.... 
} 

要使用$elemMatch,你需要创建用于products如下过滤的对象,并在hasThisElement()使用此过滤器对象:

Product filterProduct = new Product(); 
filterProduct.fooType = "bar"; 
Query q = ds.createQuery(Clients.class).field("products").hasThisElement(filterProduct); 
+0

我最初标记为正确的,但我现在还不确定。我希望能够通过fooType进行搜索。这似乎是我需要与我正在查找的对象完全匹配,而不是找到所有具有fooType =“bar”的对象,是否正确? –

+0

除非要匹配数组元素中的多个组件,否则不需要使用$ elemMatch运算符。 –

+2

此查询ds.createQuery(Clients.class).field(“products”)。hasThisElement(filterProduct)将被解释为:{“products”:{“$ elemMatch”:{“fooType”:“bar”}}} 。如果您只想返回所有在现场产品中具有“fooType”:“bar”的文档,则可以使用查询db.Clients.find({“products.fooType”:“bar”})和相应的morphia中的代码是:ds.createQuery(Clients.class).filter(“products.fooType”,“bar”); –