2013-12-11 9 views
8

ネストされた配列データを含むドキュメントがあります。私は絶望的に$elemMatchを使用してデータをフィルタリングしようとしましたが、なぜ動作しないのかわかりません。ネストされた配列データのためのelemMatchを伴うMongoDBクエリ

{ 
'id' : 1, 
'name' : 'test', 
'modules' : [ 
    { 
     name: 'foo', 
     mandatory: false, 
     group: [ 
      { 
       name: g1 
      }] 
    }, 
    { 
     name: 'bar', 
     mandatory: false, 
     group: [ 
      { 
       name: g2 
      }] 
    }] 
} 

私はこのクエリを使用してみました:

db.test.find(
{ 
    modules: { 
      $elemMatch: { 
       name: "foo", 
      } 
    } 
} 

しかし、それはすべてのモジュールを返し続けます。 mandatory: trueを使用すると何も返されませんが、それは動作していると思われます。どのようなアイデアを私は間違って何ですか?ありがとう!

+0

クエリは非常に簡単ですが、更新はどうですか? –

答えて

16

modules要素を含むすべてのドキュメントを返すのは、name == 'foo'です。出力をフィルタリングする$elemMatchを使用するには、代わりにクエリの一部のfindコールの投影引数でそれを使用する必要があります。

db.test.find({}, {modules: {$elemMatch: {name: 'foo'}}}) 

は、両方の概念を組み合わせることが、あなたは、配列のインデックスを参照することができます$とクエリにマッチした要素:

db.test.find({modules: {$elemMatch: {name: 'foo'}}}, {'modules.$': 1}) 

いずれかの方法で返します。

{ 
    "_id": ObjectId("..."), 
    "modules": [ 
    { 
     "name": "foo", 
     "mandatory": false, 
     "group": [ 
     { 
      "name": "g1" 
     } 
     ] 
    } 
    ] 
} 

出力に他のフィールドが必要な場合は、それらを投影オブジェクトに追加します(例: name: 1)。

+17

'elemMatch'をチェーンすることは可能ですか?例えば、名前の「グループ」リストにもフィルタをかけるには? – Phil

関連する問題