2012-03-14 14 views
6

インデックスにヒットするように構造をどのように構成する必要があるかを調べようとしています。MongoDB - インデックス付きのネストされたフィールドのクエリ

{ "attributes" : { "make" : "Subaru", "color" : "Red" } } 

のインデックスを持つ::私はそうのような構造化文書持つ 私が見つけた何db.stuff.ensureIndex({"attributes.make":1})

は文書で照会することはしませんしながら、ドット表記を使用して照会すると、インデックスに当たるということです。

例:

db.stuff.find({"attributes.make":"Subaru"}).explain() 
{ 
"cursor" : "BtreeCursor attributes.make_1", 
"nscanned" : 2, 
"nscannedObjects" : 2, 
"n" : 2, 
"millis" : 0, 
"nYields" : 0, 
"nChunkSkips" : 0, 
"isMultiKey" : false, 
"indexOnly" : false, 
"indexBounds" : { 
    "attributes.make" : [ 
     [ 
      "Subaru", 
      "Subaru" 
     ] 
    ] 
} 
} 

インデックスをヒットするドキュメントスタイルのクエリを取得する方法はあり

db.stuff.find({attributes:{make:"Subaru"}}).explain() 
{ 
"cursor" : "BasicCursor", 
"nscanned" : 2, 
"nscannedObjects" : 2, 
"n" : 0, 
"millis" : 1, 
"nYields" : 0, 
"nChunkSkips" : 0, 
"isMultiKey" : false, 
"indexOnly" : false, 
"indexBounds" : { 

} 
} 

対?その理由は、永続オブジェクトからクエリを構築するときは、ドット表記を使用するものとは対照的に、ドキュメントとしてそれらを直列化する方がはるかに簡単です。

また、ジャクソン社製の家庭用データマッパー層を使用していることを追加します。 Morphiaのようなものを使用すると、これらのクエリを適切に構築するのに役立つでしょうか?

答えて

7

さらにいくつかの掘り出しがありましたか?this threadは、サブドキュメントクエリで何が起こっているのかを説明しました。上記の私の問題は、サブ文書ベースのクエリをドット表記のように動作させるために、elemMatchを使用する必要があるということでした。

db.stuff.find({"attributes":{"$elemMatch" : {"make":"Subaru"}}}).explain() 
{ 
"cursor" : "BtreeCursor attributes.make_1", 
"nscanned" : 2, 
"nscannedObjects" : 2, 
"n" : 0, 
"millis" : 2, 
"nYields" : 0, 
"nChunkSkips" : 0, 
"isMultiKey" : false, 
"indexOnly" : false, 
"indexBounds" : { 
    "attributes.make" : [ 
     [ 
      "Subaru", 
      "Subaru" 
     ] 
    ] 
} 
} 
関連する問題