2016-04-08 22 views
0

これは私の完全なドキュメントであり、一度に1つまたは2つのサブブロックだけが必要です。mongoDBのネストされた要素を取得する方法は?

{ 
"_id": ObjectId('12abc'), 
"createdAt": ISODate('2016-04-04T06:04:53.486Z'), 
"updatedAt": ISODate('2016-04-04T06:04:53.486Z'), 
"updatedBy": "SSE", 
"DocName": "doc1", 
"MainObj": { 
    "One": { 
     "color": { 
      "green": [ 
       { 
        "val": "01", 
        "val2": "0" 
       }, 
       { 
        "val": "10", 
        "val2": "5" 
       } 
      ], 
      "result": "0000" 
      } 
     } 

    "Two": { 
     "color1": { 
      "blue": [ 
       { 
        "val": "01", 
        "val2": "0" 
       }, 
       { 
        "val": "10", 
        "val2": "5" 
       } 
      ], 
      "result": "0000" 
      } 
        } 
       } 
} 

これは私の予想ブロックである: つ」:{ "色":{ "緑":[ { "ヴァル": "01"、 "VAL2": "0" }、{ "ヴァル": "10"、 "VAL2": "5" }]、 "結果": "0000" } }}

+0

私が見ることができるように、余分な括弧が1つあります。親切に正しいコレクションをチェックして投稿してください。 –

+0

@Himanshu、Corrected。それを指摘してくれてありがとう。 – tiya

答えて

0

を使用すると、1つと呼ばれる変数にサブ文書(MainObj.One)に突出した後、ちょうどその変数を返すことによって、集約フレームワークでこれを行うことができます。例えば:

db.YourCollectionName.aggregate([ 
    {$project:{One:"$MainObj.One"}}, 
    {$project:{_id:0,One:1}} 
]); 

戻りこれ:

https://docs.mongodb.org/manual/reference/operator/aggregation/

更新:ここcreatedAtを含めるためのコードである、集約フレームワークと$projectオペレータに

{ "One" : { "color" : { "green" : [ { "val" : "01", "val2" : "0" }, { "val" : "10", "val2" : "5" } ], "result" : "0000" } } } 

詳細updatedAt、updatedBy、およびDocName:

db.YourCollectionName.aggregate([ 
    {$project:{One:"$MainObj.One",createdAt:"$createdAt",updatedAt:"$updatedAt",updatedBy:"$updatedBy",DocName:"$DocName"}}, 
    {$project:{_id:0,One:1,createdAt:1,updatedAt:1,updatedBy:1,DocName:1}} 
]); 

戻り値:

{ 
    "createdAt" : ISODate("2016-04-04T06:04:53.486Z"), 
    "updatedAt" : ISODate("2016-04-04T06:04:53.486Z"), 
    "updatedBy" : "SSE", 
    "DocName" : "doc1", 
    "One" : { 
     "color" : { 
      "green" : [ { "val" : "01", "val2" : "0" }, { "val" : "10", "val2" : "5" } ], 
      "result" : "0000" 
     } 
    } 
} 

注:

db.YourCollectionName.find({},{createdAt:1,updatedAt:1,updatedBy:1,DocName:1,"MainObj.One":1}); 

唯一の違いは、これは、サブ文書としてOne戻ってくるということです。次のようにこれを行うには非常に簡単な方法は次のようになりMainObj(これは元の質問で尋ねられたものとは異なります):

{ 
    "createdAt" : ISODate("2016-04-04T06:04:53.486Z"), 
    "updatedAt" : ISODate("2016-04-04T06:04:53.486Z"), 
    "updatedBy" : "SSE", 
    "DocName" : "doc1", 
    "MainObj" : { 
     "One" : { 
      "color" : { 
       "green" : [ { "val" : "01", "val2" : "0" }, { "val" : "10", "val2" : "5" } ], 
       "result" : "0000" 
      } 
     } 
    } 
} 
+0

ありがとうMark。それは私のために働いた。 – tiya

+0

Mark、既存の結果フィールド「createdAt」と一緒にフィールドの下にどのように表示することができますか?ISODate( '2016-04-04T06:04:53.486Z')、 「updatedAt」:ISODate -04T06:04:53.486Z ')、 "updatedBy": "SSE"、 "DocName": "doc1"、 – tiya

+0

更新された回答とフィールドの取得方法を参照してください。 – markwatsonatx

関連する問題