2016-09-06 14 views
0

Array内の配列からオブジェクトをクエリし、それを最上位のオブジェクトとして取得する方法はありますか?たとえば、次のレコードを考えてみましょう。MongoDB - 深いサブ文書からオブジェクトを取得する

{ 
    "subjects": [ 
     { 
      "name": "English", 
      "teachers": [ 
        { 
        "name": "Mark" /* Trying to get this object*/ 
        }, 
        { 
        "name": "John" 
        } 
       ] 
     } 
    ] 
} 

私はトップレベルオブジェクトとして次のオブジェクトを取得しようとしています。

​​

答えて

1

あなたが求めるものを正確に行うには、aggregationフレームワークを使用する必要があります。

ここで、あなたが収集した文書:fooを入力しました。私たちはその後、アグリゲーションパイプラインの私たちの最初の段階に入る私達の配列を解明するためにほどく$を使用し

> db.foo.find().pretty() 

{ 
    "_id" : ObjectId("57ceed3d31484d5b491eaae9"), 
    "subjects" : [ 
     { 
      "name" : "English", 
      "teachers" : [ 
       { 
        "name" : "Mark" 
       }, 
       { 
        "name" : "John" 
       } 
      ] 
     } 
    ] 
} 

> db.foo.aggregate([ 
...  {$unwind: "$subjects"} 
... ]).pretty() 

{ 
    "_id" : ObjectId("57ceed3d31484d5b491eaae9"), 
    "subjects" : { 
     "name" : "English", 
     "teachers" : [ 
      { 
       "name" : "Mark" 
      }, 
      { 
       "name" : "John" 
      } 
     ] 
    } 
} 

被験者は、[ので、ここでの唯一の違いは以下のいずれか少ないセットで長さ1の配列でした]配列の大括弧。

もう一度やり直す必要があります。

> db.foo.aggregate([ 
...  {$unwind: "$subjects"}, 
...  {$unwind: "$subjects.teachers"} 
... ]).pretty() 

{ 
    "_id" : ObjectId("57ceed3d31484d5b491eaae9"), 
    "subjects" : { 
     "name" : "English", 
     "teachers" : { 
      "name" : "Mark" 
     } 
    } 
} 
{ 
    "_id" : ObjectId("57ceed3d31484d5b491eaae9"), 
    "subjects" : { 
     "name" : "English", 
     "teachers" : { 
      "name" : "John" 
     } 
    } 
} 

長さ '2'の配列を2つの別々のドキュメントにしました。最初のものはsubjects.teachers.name = Markで、2番目のものはsubjects.teachers.name = Johnです。

私たちは、$ matchステージをパイプラインに追加する必要があるので、単にname = Markというケースを返すだけです。

> db.foo.aggregate([ 
...  {$unwind: "$subjects"}, 
...  {$unwind: "$subjects.teachers"}, 
...  {$match: {"subjects.teachers.name": "Mark"}} 
... ]).pretty() 

{ 
    "_id" : ObjectId("57ceed3d31484d5b491eaae9"), 
    "subjects" : { 
     "name" : "English", 
     "teachers" : { 
      "name" : "Mark" 
     } 
    } 
} 

OK!今我々は、名前:マークの場合にのみ一致している。

$プロジェクトケースを追加して、私たちの入力内容を形にしてみましょう。

> db.foo.aggregate([ 
...  {$unwind: "$subjects"}, 
...  {$unwind: "$subjects.teachers"}, 
...  {$match: {"subjects.teachers.name": "Mark"}}, 
...  {$project: {"name": "$subjects.teachers.name", "_id": 0}} 
... ]).pretty() 

{ "name" : "Mark" } 
+0

詳細についてはありがとうございます。 –

+1

https://docs.mongodb.com/manual/reference/operator/aggregation/literal/#exp._S_literal 例: {$ project:{"name": "$ subjects.teachers .name "、" _id ":0、" address ":{$ literal:" 123 ABC "}}} – dyouberg

+0

いいえ、私は情報をコレクションに更新することを意味します。コレクションは、なるように: { "科目":[ { "名": "英語"、 "先生":[ { "名": "マーク"、 "住所":「123 ABC XYZ」 は}、{ "名": "ジョン" } ] } ] } –

関連する問題