2012-04-18 10 views
0

これが可能かどうかはわかりませんが、ここには入ります。Java morphia - リストフィールドの値による照会

私は(この例では単純化しますが、考え方は同じです)、次のようなテーブルで(それにアクセスするためにmorphiaを使用して)MongoDBのを持っている:

{ Name : "Robert", NickNames : [ "Bob", "Twinkletoes" ] } 
{ Name : "Trevor", NickNames : [ "Bob", "Mad man", "Tweedledee" ] } 
{ Name : "Samuel", NickNames : [ "Sam" ] } 
{ Name : "Patrick", NickNames : [ "Bob", "Mad man" ] } 
{ Name : "Mark", NickNames : [ "Adam", "Bob", "Georg" ] } 

そして、この例の目的ましょうのためにニックネームは常にアルファベット順であり、ニックネームの位置は関連していると言います。

このように、すべての人物のレコードには、リスト内のニックネームの数を変えることができます。どのように私は、次の検索を行うことができます。

  • は最初のニックネームは「ボブ」と第二のニックネーム「マッド・マン」(すなわちPerson.Nicknames [0] =「ボブ」& &人と私にすべての人々を与えます。ニックネーム[1] = "Mad man")

    TrevorとPatrickの2つのレコードを返す必要があります。ロバート、トレバーとパトリック -

  • は、最初のニックネームは "ボブ"(すなわちPerson.Nicknames [0] = "ボブ")

    が3つのレコードを返すべきで私にすべての人々を与えます。

「ボブ」のニックネームが最初のインデックスにないため、マークが返されなかったことに注意してください。

これを行う方法はありますか?

答えて

3

たら、その順序は保持されます。

あなたがそれらを期待してクエリが動作するはずです:

> db.people.find({"NickNames.0":"Bob", "NickNames.1":"Mad man"}, {_id:0}) 
{ "Name" : "Trevor", "NickNames" : [ "Bob", "Mad man", "Tweedledee" ] } 
{ "Name" : "Patrick", "NickNames" : [ "Bob", "Mad man" ] } 
> db.people.find({"NickNames.0":"Bob"}, {_id:0}) 
{ "Name" : "Robert", "NickNames" : [ "Bob", "Twinkletoes" ] } 
{ "Name" : "Trevor", "NickNames" : [ "Bob", "Mad man", "Tweedledee" ] } 
{ "Name" : "Patrick", "NickNames" : [ "Bob", "Mad man" ] } 
> 

は「ドット表記の部分(到達「の位置によって配列要素」で、この上で簡単にメモしてあります(_idは、簡潔にするため省略します)オブジェクトに)」ドキュメント: http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29#DotNotation%28ReachingintoObjects%29-ArrayElementbyPosition

上記はJSシェルで行われました。私はMorphiaに精通していないので、正しいMorphiaの構文にクエリを翻訳しなければなりません。お役に立てれば!

+1

私は答えに感謝してくれました。実際にクエリをmorphiaに変換すると、次のようになります:*** query.field( "NickNames.0")。equal( "Bob"); ***注意してください。 (** query.disableValidation()**) –

0

ポジションは適切ですか?最初のクエリでも次のものが見つかるはずですか?正確な位置が関連していない場合は

{ Name : "Mark", NickNames : [ "Adam", "Bob", "Georg" ] } 

、あなたはhasThisElementhasAllOf(関連部分のみ)を使用することができます:要素が配列に挿入されている

.field("NickNames").hasThisElement("Bob") 
.field("NickNames").hasAllOf(Arrays.asList(yourArrayOfStrings)) 
+0

残念ながら、私の場合、ポジションは関連性がありません。これを反映するように私の質問を更新させてください。 –

+0

それから私は知らない。私はMorphia/MongoDBがあなたの注文を保つことを保証するものではないと確信しています(彼らは一般的にはそうしていますが、常にそうであるかどうかは分かりません)。 注文が保証されている場合は、最初の2つのエントリを 'limit(2)' 'で取り出すことができます(最初のエントリから始めたくない場合は' 'offset()' 'を使います) Javaの '' contains''です。かなりではありませんが、おそらく回避策... – xeraa

+0

これは残念です。私はその後データ構造を見直さなければならないかもしれません。 –

関連する問題