2017-02-11 43 views
2

我有一個projects收集與文件如這樣:MongoDB的3.4 - 獲得子文檔的數組沒有根文件

{ 
     "_id" : ObjectId("589eff3fee3d13019843f55a"), 
     "name" : "Project A", 
     "desc" : "test", 
     "numofvms" : 0, 
     "templates" : [ 
       { 
         "_id" : ObjectId("589e4c14ee3d131bac8b403c") 
       }, 
       { 
         "_id" : ObjectId("589e4c1dee3d131bac8b403d") 
       } 
     ], 
     "nodes" : [ 
       { 
         "_id" : ObjectId("589eff8f2bb59057c3f9b89d"), 
         "name" : "Node A" 
       }, 
       { 
         "_id" : ObjectId("589eff962bb59057c3f9b89e"), 
         "name" : "Node B" 
       }, 
       { 
         "_id" : ObjectId("589eff982bb59057c3f9b89f"), 
         "name" : "Node C" 
       }, 
       { 
         "_id" : ObjectId("589eff9a2bb59057c3f9b8a0"), 
         "name" : "Node D" 
       } 
     ], 
     "links" : [ ] 
} 

我嘗試接收子文檔(nodes場)給定文檔的數組(項目) ,但沒有根文件。結果應該是這樣的:

[ 
     { 
       "_id" : ObjectId("589eff8f2bb59057c3f9b89d"), 
       "name" : "Node A" 
     }, 
     { 
       "_id" : ObjectId("589eff962bb59057c3f9b89e"), 
       "name" : "Node B" 
     }, 
     { 
       "_id" : ObjectId("589eff982bb59057c3f9b89f"), 
       "name" : "Node C" 
     }, 
     { 
       "_id" : ObjectId("589eff9a2bb59057c3f9b8a0"), 
       "name" : "Node D" 
     } 
] 

我試圖像下面的一個不同的方法,但無法擺脫的根文件:

> db.projects.find({_id: ObjectId("589eff3fee3d13019843f55a")}, { "nodes": 1, _id: 0 }).pretty() 
{ 
     "nodes" : [ 
       { 
         "_id" : ObjectId("589eff8f2bb59057c3f9b89d"), 
         "name" : "Node A" 
       }, 
       { 
         "_id" : ObjectId("589eff962bb59057c3f9b89e"), 
         "name" : "Node B" 
       }, 
       { 
         "_id" : ObjectId("589eff982bb59057c3f9b89f"), 
         "name" : "Node C" 
       }, 
       { 
         "_id" : ObjectId("589eff9a2bb59057c3f9b8a0"), 
         "name" : "Node D" 
       } 
     ] 
} 

可以這樣在查詢中直接取得或者我必須在我的應用程序中手動提取數組?

回答

0

試試這個:

db.collection.aggregate([ 
    { 
     $unwind: '$nodes' 
    }, 
    { 
     $match: {_id: ObjectId("589eff3fee3d13019843f55a") } 
    }, 
    { 
     $replaceRoot: { newRoot: "$nodes" } 
    } 
]).toArray(); 

,你會得到

[ 
    { 
     "_id" : ObjectId("589eff8f2bb59057c3f9b89d"), 
     "name" : "Node A" 
    }, 
    { 
     "_id" : ObjectId("589eff962bb59057c3f9b89e"), 
     "name" : "Node B" 
    }, 
    { 
     "_id" : ObjectId("589eff982bb59057c3f9b89f"), 
     "name" : "Node C" 
    }, 
    { 
     "_id" : ObjectId("589eff9a2bb59057c3f9b8a0"), 
     "name" : "Node D" 
    } 
] 

$unwind操作是從輸入文檔解構nodes場輸出的每個元素的文檔。

然後用$replaceRoot階段將nodes文檔推廣到頂層,丟棄當前頂層字段。

希望這會有所幫助。

1

這裏是你如何與聚合(蒙戈V3.4 +)做到這一點:

db.projects.aggregate([ 
 
\t {$match: {_id: ObjectId("589eff3fee3d13019843f55a")}}, 
 
\t {$unwind: '$nodes'}, 
 
\t {$replaceRoot: { newRoot: "$nodes"}} 
 
]).toArray();

退房the docs