文件结构(仅供说明)
员工
{
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中。你明白了。我不希望这些员工被退回。
如果可能,请告诉我。非常感谢。
答案 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
不幸的是,我不太了解吗啡,但希望能给你足够的信息来解决它。