1

ドキュメント構造 (説明用)

従業員

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

クエリ -

Addresses -> street (type String) と Addresses -> country -> name (type 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)

結果を取得しません (実際に一致する場合)。部分的な「国」ドキュメントの一致が原因のようです。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");

しかし、これは Employee where street="bla bla" and country.name!="hoo" in address#1 と、street!="bla bla" and country.name="hoo" address #2 に一致します。あなたは要点を理解します。そのような従業員を返してほしくありません。

これが可能かどうか教えてください。どうもありがとう。

4

1 に答える 1

1

それが可能だ。MongoDB には、このような状況のための elemMatch と呼ばれる特別な演算子があります。Morphia はそれをサポートしています。

2 番目のアプローチが正しい方法であることは正しいです (最初のアプローチは、サブキーではなく、国全体を照合しようとしています)。唯一のことは、street と 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 に答える