【问题标题】:MongoDB: Aggregate and flatten an array fieldMongoDB:聚合和展平数组字段
【发布时间】:2020-09-23 20:18:57
【问题描述】:

在使用关系数据库(SQL Server、MySQL、Oracle、Informix)工作了 28 年后,我转向了 MongoDB。过去两周进展缓慢。我想提交几个问题来确认我的想法。

我的文档如下所示(忽略此问题的分组):

{
    "_id": "xyz-800",
    "site": "xyz",
    "user": 800,
    "timepoints": [
        {"timepoint": 0, "a": 1500, "b": 700},
        {"timepoint": 2, "a": 1000, "b": 200},
        {"timepoint": 4, "a": 3500, "b": 1500}
    ],
    "groupings": [
        {"type": "MNO", "group": "<10%", "raw": "1"},
        {"type": "IJK", "group": "Moderate", "raw": "23"}
    ]
}

我想展平时间点嵌套数组。以下工作,但是有没有办法在时间点中通配符而不是列出每个属性?原因可能是如果将新属性(例如,'c')添加到子文档中,我必须修改代码,或者如果该子文档有很多属性,我需要列出每个属性而不是使用通配符,如果可能。

db.records.aggregate( {$unwind : "$timepoints"}, 
                      {$project: {_id: 1, site: 1, user: 1, 
                                  'timepoint': '$timepoints.timepoint', 
                                  'a': '$timepoints.a', 
                                  'b': '$timepoints.b'}})

结果:

{"id":"xyz-800", "site":"xyz", "user":800, "timepoint": 0, "a":1500, "b":700}
{"id":"xyz-800", "site":"xyz", "user":800, "timepoint": 2, "a":1000, "b":200}
{"id":"xyz-800", "site":"xyz", "user":800, "timepoint": 4, "a":3500, "b":1500}

我目前使用的是 MongoDB 3.2

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    从 MongoDb 3.4 开始,我们可以使用 $addFields 将顶级字段添加到嵌入文档中,并使用 $replaceRoot 来将嵌入文档提升到顶层。

    db.records.aggregate({
        $unwind: "$timepoints"
    }, {
        $addFields: {
            "timepoints._id": "$_id",
            "timepoints.site": "$site",
            "timepoints.user": "$user"
        }
    }, {
        $replaceRoot: {
            newRoot: "$timepoints"
        }
    })
    

    样本输出

    { "timepoint" : 0, "a" : 1500, "b" : 700, "_id" : "xyz-800", "site" : "xyz", "user" : 800 }
    { "timepoint" : 2, "a" : 1000, "b" : 200, "_id" : "xyz-800", "site" : "xyz", "user" : 800 }
    { "timepoint" : 4, "a" : 3500, "b" : 1500, "_id" : "xyz-800", "site" : "xyz", "user" : 800 }
    

    【讨论】:

    • 非常感谢,我希望得到像'timepoints.*': 1 这样的东西。 3.4 中有趣的新运算符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 2014-02-27
    • 1970-01-01
    • 2020-04-17
    相关资源
    最近更新 更多