【问题标题】:MongoDB 3.4 - get array of subdocuments without root documentMongoDB 3.4 - 获取没有根文档的子文档数组
【发布时间】:2017-06-29 18:46:33
【问题描述】:

我有一个 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" : [ ]
}

我尝试接收给定文档(项目)的子文档数组(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"
                }
        ]
}

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

【问题讨论】:

    标签: arrays mongodb field subdocument


    【解决方案1】:

    试试这个:

    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文档提升到顶级,丢弃当前顶级字段。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      以下是使用聚合 (Mongo v3.4+) 执行此操作的方法:

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

      查看the docs

      【讨论】:

      • 您的代码 sn-p 似乎不起作用,但您的回答在技术上是正确的。
      猜你喜欢
      • 2017-10-17
      • 2014-02-02
      • 2021-03-19
      • 1970-01-01
      • 2018-01-26
      • 1970-01-01
      • 2014-09-26
      • 2014-06-10
      相关资源
      最近更新 更多