1

文档结构(仅用于说明)

员工

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

询问 -

我只有地址 -> 街道(字符串类型)和地址 -> 国家 -> 名称(字符串类型)。我想让所有符合这个标准的员工。

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)

不获取结果(当实际上有一个真正的匹配时)。看起来是因为部分“国家”文件匹配。如果我填充Country 的所有字段,它会得到预期的结果。

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

问题 #2:地址是一个数组,我可以获得多个 (address#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");

但这将匹配地址#1 中的 street="bla bla" 和 country.name!="hoo" 以及地址#2 中的 street!="bla bla" 和 country.name="hoo" 的员工。你明白了。我不希望这样的员工被退回。

请让我知道这是否可能。非常感谢。

4

1 回答 1

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

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

于 2012-03-27T15:46:16.713 回答