基于嵌套文档的可用部分数据进行查询(在morphia,mongoDB中)

时间:2012-03-27 04:31:17

标签: java mongodb morphia mongodb-java

文件结构(仅供说明)

员工

{
name : "..",
age : ..,
addresses   [
  {
     "street":"...",
     "country":{
        name:"..",
        continent:"..",
        Galaxy:".."
     }
  }
],
company:".."
}

查询 -

我只有地址 - > street(类型字符串)和地址 - >国家 - > name(类型String)。我想让所有符合此标准的员工。

Address a1 = new Address();
a1.setStreet("bla bla");
Country c = new Country();
c.setName("sth");
a1.setCountry(c);

Query<Employee> q = ds.createQuery(Employee.class).field("addresses").hasThisElement(a1)

不获取结果(实际存在真实匹配时)。看起来像是因为部分“国家”文件匹配。如果我填充所有字段的国家/地区,它会按预期获得结果。

问题#1:上述任何解决方法?

问题#2:地址是一个数组,我可以得到多个(地址#street,country#name)对,我想再次匹配给定对的员工列表。 类似的东西:

Query<Employee> q =  ds.createQuery(Employee.class).field("addresses").hasThisElement(a1).field("addresses").hasThisElement(a2).field(..) // and so on

注意:我可以按地址匹配地址匹配

Address a = new Address();
a.setStreet("bla bla");
q.createQuery(Employee.class).field("addresses").hasThisElement(a).field("addresses.country.name").equal("hoo");

但这将匹配Employee,其中street =“bla bla”和country.name!=“hoo”在地址#1和street!=“bla bla”和country.name =“hoo”在地址#2中。你明白了。我不希望这些员工被退回。

如果可能,请告诉我。非常感谢。

1 个答案:

答案 0 :(得分:1)

这是可能的。 MongoDB有一个特殊的操作符,用于这种叫做elemMatch的情况。 Morphia支持它。

你是对的,第二种方法是正确的方法(第一种方法是尝试匹配整个国家,而不是子项)。唯一的想法是你想将它限制在一个同时包含street和country.name匹配的单个元素。不是具有匹配街道和匹配country.name的文档。

此文档页面和此主题提供了更多信息。

http://code.google.com/p/morphia/wiki/Query

http://groups.google.com/group/morphia/tree/browse_frm/month/2011-02/5bd3f654526fa30b?rnum=41&lnk=ol

不幸的是,我不太了解吗啡,但希望能给你足够的信息来解决它。