0

これが可能かどうかはわかりませんが、ここに行きます。

次のようなテーブルを持つ MongoDB (アクセスに morphia を使用) があります (この例では単純化されていますが、概念は同じです)。

{ 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" ] }

この例では、ニックネームが常にアルファベット順であり、ニックネームの位置が関連しているとします。

したがって、すべての人物レコードがリスト内のニックネームの数を異ならせることができることがわかります。次の検索を実行するにはどうすればよいですか。

  • 最初のニックネームが「Bob」で、2 番目のニックネームが「Mad man」のすべての人を教えてください (つまり、Person.Nicknames[0] = "Bob" && Person.Nicknames[1] = "Mad man")

    Trevor と Patrick の 2 つのレコードを返す必要があります。

  • 最初のニックネームが "Bob" のすべての人を教えてください (つまり、Person.Nicknames[0] = "Bob")

    Robert、Trevor、および Patrick の 3 つのレコードを返す必要があります。

Mark のニックネーム "Bob" が最初のインデックスに含まれていなかったため、Mark は返されなかったことに注意してください。

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

4

2 に答える 2

3

要素が配列に挿入されると、それらの順序は保持されます。

クエリは期待どおりに機能するはずです:(簡潔にするために_idは省略)

> 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" ] }
> 

これについては、「ドット表記(オブジェクトに到達)」ドキュメントの「位置ごとの配列要素」セクションに簡単なメモがあります: http ://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into + Objects%29#DotNotation%28ReachingintoObjects%29-ArrayElementbyPosition

上記はJSシェルで行われました。私はMorfiaに精通していないため、クエリを正しいMorfia構文に自分で変換する必要があります。お役に立てれば!

于 2012-04-18T15:12:55.173 に答える
0

ポジションは関係ありますか?最初のクエリは次のものも見つける必要がありますか?

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

正確な位置が関係ない場合は、hasThisElementand hasAllOf(関連する部分のみ)を使用できます。

.field("NickNames").hasThisElement("Bob")
.field("NickNames").hasAllOf(Arrays.asList(yourArrayOfStrings))
于 2012-04-18T01:10:45.550 に答える