2016-04-29 13 views
0

オブジェクトの配列内の配列のプロパティの値と一致するものを見つける:MongoDBは、私が文書構造を持っている

{ 
    "field1": "value", 
    "field2": "value", 
    "items": [ 
     { 
      "inField1": "value1", 
      "inField2": "value2", 
      "votes": { 
       "count": 2, 
       "people": [ 
        { 
         "username": "user1", 
         "image": "http://image/to/user1/profile.jpg" 
        }, 
        { 
         "username": "user2", 
         "image": "http://image/to/user2/profile.jpg" 
        } 
       ] 
      } 
     }, 
     { 
      "inField1": "value3", 
      "inField2": "value4", 
      "votes": { 
       "count": 1, 
       "people": [ 
        { 
         "username": "user1", 
         "image": "http://image/to/user1/profile.jpg" 
        } 
       ] 
      } 
     } 
    ] 
} 

I必要なすべての項目(項目フィールドの単一オブジェクト)ここで、任意の人でプロパティのプロパティは、ユーザ名が、ユーザ1となっていますか?上記で

は、それらの両方は、ユーザー名プロパティにUSER1が含まれているとして、それは、両方のアイテムを返す必要があります例を述べたが、私はuser2のを検索する場合、その後ONL最初の項目が返されます。

答えて

0

この質問への答えは、別のSOのリンクで見つかりました: https://stackoverflow.com/a/20155210/2641194

まず、我々が持っているに$各ため配列し、データの両方をアンワインド人々は別の文書であり、次に$と一致するが表示され、クエリを満たす人物のみが選択されます。

db.collection('topic').aggregate(
    [{ 
     "$unwind": "$items" 
    }, { 
     "$unwind": "$items.votes.people" 
    }, { 
     "$match": { 
      "items.votes.people.username": "user2" 
     } 
    }], function(err, docs) { 
     if(!err) { 
      docs.forEach(function(doc) { 
       // code 
      }); 

     } else { 
      console.log(err); 
     } 
     db.close(); 
    }); 

あなたはさらに$がをほどく理解するために、どのようにそれは、このMongoDBのドキュメントのリンクを参照してください動作しない必要がある場合:https://docs.mongodb.org/manual/reference/operator/aggregation/unwind/

0

集約フレームワークを使用して、まずアイテム配列を巻き戻して一致させます。

これを試してみてください:

db.getCollection('test').aggregate(
    [{ 
     "$unwind": "$items" 
    }, { 
     "$match": { 
      "items.votes.people.username": "user2" 
     } 
    }] 
) 
+0

ハズレ!他の提案はありますか? – HVT7

関連する問題