MongoDB 3.4 - 获取没有根文档的子文档数组

NoB*_*ect 7 arrays field mongodb subdocument

我有一个projects包含以下文件的集合:

{
        "_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" : [ ]
}
Run Code Online (Sandbox Code Playgroud)

我尝试接收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"
        }
]
Run Code Online (Sandbox Code Playgroud)

我尝试了如下不同的方法,但无法摆脱根文档:

> 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"
                }
        ]
}
Run Code Online (Sandbox Code Playgroud)

这可以直接在查询中实现还是我必须在我的应用程序中手动提取数组?

McG*_*ady 8

尝试这个:

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

你会得到

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

$unwind操作符是nodes从输入文档中解构字段,为每个元素输出一个文档。

然后使用$replaceRoot阶段将nodes文档提升到顶级,丢弃当前顶级字段。

希望这可以帮助。