【问题标题】:mongodb Aggregation Pipeline to create a list of values from multiple nested document propertiesmongodb 聚合管道从多个嵌套文档属性创建值列表
【发布时间】:2020-03-16 14:58:46
【问题描述】:

我有两个集合,db.items 和 db.data,格式如下:

// db.items document (configuration-level information such as name, settings, user, etc.)
{
    _id: #id,
    ...
}

// db.data document (data for the a configuration)
{
    ...,
    item: #id, // reference to _id of db.item doc
    grouping_1: [
        { name: "A", item: "ObjectId()" },
        { name: "B", item: "ObjectId()" }
    ],
    grouping_2: [
        { name: "C", item: "ObjectId()" },
        { name: "D", item: "ObjectId()" }
    ]
}

我似乎无法弄清楚如何使用Aggregation Pipeline 为 db.item doc 提供 db.data“名称”道具的列表。

// db.items document desired result
{
    _id: #id,
    names: ["A", "B", "C", "D"],
    ...
}

诸如db.data.find( { item: #id }, { _id: 0, "grouping_1.name": 1, "grouping_2.name": 1 } )之类的查询由于某种原因返回了{ "grouping_1": [ { "name": "A" }, { "name": "B" } ], "grouping_2" : [ { "name": "C" }, { "name", "D" } ] }这样的集合

我希望看到同时使用 shell 和 C# 驱动程序 (2.10) 的实现;但是,如果您只能提供一个/要求太多,我会很乐意接受任何一个。

编辑: 我正在考虑将我的架构重组为这样的东西可能更有意义/更容易使用。

{
    ...,
    grouping_1: {
        "A": "ObjectId()",
        "B": "ObjectId()"
    },
    grouping_2: {
        "C": "ObjectId()",
        "D": "ObjectId()"
    }
}

编辑 2: 对于任何拥有我在第一次编辑中建议的架构的人,here's the solution

【问题讨论】:

    标签: c# .net mongodb aggregation-framework mongo-shell


    【解决方案1】:

    我相信这条管道会给你带来预期的结果:

    db.Item.aggregate([
        {
            $match: {
                _id: ObjectId("5e6f98e41b70ea2c14c208b9")
            }
        },
        {
            $lookup: {
                from: "Data",
                localField: "_id",
                foreignField: "item",
                as: "data"
            }
        },
        {
            $project: {
                names: {
                    $map: {
                        input: {
                            $concatArrays: [
                                { $arrayElemAt: ["$data.grouping_1", 0] },
                                { $arrayElemAt: ["$data.grouping_2", 0] }]
                        },
                        in: '$$this.name'
                    }
                }
            }
        }
    ])
    

    https://mongoplayground.net/p/H3Q3N0-P9JB

    这里有一个good way 在 c# 中执行这个管道

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-26
      • 2021-12-13
      • 2013-09-18
      • 2020-03-08
      • 2019-07-20
      相关资源
      最近更新 更多