2017-02-11 106 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