2017-02-11 5 views
2
{ 
"_id" : 123, 
"someKey" : "someValue", 
"someArray" : [ 
    { 
     "name" : "name1", 
     "someNestedArray" : [ 
      { 
       "name" : "value_1", 
       "fame" : [ 
        { 
         "goal" : "goal_1" 
        } 
       ] 
      }, 
      { 
       "name" : "value_2", 
       "fame" : [ 
        { 
         "goal" : "goal_2" 
        } 
       ] 
      } 
     ] 
    } 
] 
} 

を抽出する私のようなクエリを行います。は、ネストされた配列でMongoDBの中の特定の要素

db.getCollection('city').find({"someArray.0.someNestedArray.1.fame.0.goal":"goal_2"},{"someArray.0.someNestedArray.":1}) 

しかしとして出力を得る:として出力を取得するためのクエリは何

{ 
"_id" : 123, 
"someArray" : [ 
    {} 
] 
} 

{ 
"fame" : [ 
       { 
        "goal" : "goal_2" 
       } 
      ] 
} 

ありがとうございます。 また、インデックスがわからない場合は、ネストされた配列の値を見つける方法も教えてください。

db.test.find(
    {'someArray.someNestedArray.fame.goal':'goal_1'}, 
    {"someArray.someNestedArray.fame.goal":1,"_id":0} 
) 

そして、あなたが得る:私が行っている クエリは、ちょうどこの次のクエリを使用することができる配列要素の位置(someArray.0.someNestedArray.1.fame.0.goal)

+0

check [mongodb位置演算子](https://docs.mongodb.com/manual/reference/operator/update/positional/) –

+0

位置$演算子は、複数の配列を走査するクエリには使用できません。 $プレースホルダの置き換えが単一の値であるため、他の配列にネストされた配列を横断するクエリ。 –

答えて

2

を指定しますドキュメント:

{ 
    "someArray" : [ 
     { 
      "someNestedArray" : [ 
       { 
        "fame" : [ 
         { 
          "goal" : "goal_1" 
         } 
        ] 
       }, 
       { 
        "fame" : [ 
         { 
          "goal" : "goal_2" 
         } 
        ] 
       } 
      ] 
     } 
    ] 
} 

また、あなたが$elemMatch

に$ elemMatchはoperを使用しようとすることができatorは、指定されたすべてのクエリ の条件に一致する要素が少なくとも1つある配列フィールド を含むドキュメントと一致します。

db.test.find(
{ 
    'someArray':{ 
     $elemMatch:{ 
      'someNestedArray':{ 
       $elemMatch:{ 
        'fame':{ $elemMatch: {"goal" : "goal_2" } } 
        } 
       } 
     } 
    } 
},{"someArray.someNestedArray.fame.goal":1} 
); 

あなたは、サブドキュメントを返すように$unwind$replacerootを使用しようとすると、投写中にアレイをフィルタリングするために、新たな$filter集計演算子を使用することができます。

これが役に立ちます。

関連する問題