【问题标题】:Sum of column inside a array in MongodbMongodb中数组内的列总和
【发布时间】:2020-02-27 13:18:39
【问题描述】:

我是 MongoDB 的新手,并试图找出 device_status 的总和 给定序列号的 device_execution 数组。例如序列号 ELMESR0719PXN6 在给定的情况下有两个设备状态分别为 200 和 400 时间。每 5 分钟后设备状态不断出现,我们正在存储它。所以 我们要为每个序列号添加状态 200 或 400 的总和。下面是 包含所有详细信息的文档:

输出应如下所示:

Serial number     Device_status     Sum
ELMESR0719PXN6    200               5
                  400               5
{
        "_id" : ObjectId("5e57b3376c8b9aabd5312840"),
        "ve_serial_number" : "ELMESR0719PXN6",
        "ve_type" : "eVE",
        "start_ts" : "2020-02-19T00:00:00.000+00:00",
        "end_ts" : "2020-02-19T23:59:59.999+00:00",
        "device_execution" : [
                {
                        "execution_time" : "2020-02-19T00:00:00.000+00:00",
                        "device_status" : {
                                "200" : 4,
                                "400" : 2
                        }
                },
                {
                        "execution_time" : "2020-02-19T00:02:00.000+00:00",
                        "device_status" : {
                                "200" : 1,
                                "400" : 3
                        }
                }
        ]
}

您能帮我找到解决方案吗?在此先感谢。

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    这个给出了预期的结果:

    db.collection.aggregate([
       { $unwind: "$device_execution" },
       {
          $group: {
             _id: "$ve_serial_number",
             "400": { $sum: "$device_execution.device_status.400" },
             "200": { $sum: "$device_execution.device_status.200" }
          }
       }
    ])
    

    结果:

    { 
        "_id" : "ELMESR0719PXN6", 
        "200" : 5.0, 
        "400" : 5.0
    }
    

    格式不是最终格式,这个我留给你。

    【讨论】:

    • 我可以在上面的查询中添加“execution_time”检查,以便根据时间间隔找到给定序列号的响应总和吗?
    • 是的,当然。将是_id:_id: { ve_serial_number: "$ve_serial_number", execution_time: "$execution_time" }
    • 感谢 Wernfried 的快速回答。现在它也显示执行时间,但我认为我的问题是错误的。实际上基于执行时间,我想显示序列号和响应的总和。假设如果用户想要显示所选执行时间的详细信息(下午 2 点到 3 点之间有多少序列号以及响应的总数)。抱歉问了太多问题!
    • 添加喜欢{$match: {$gte: ["$start_ts", "2020-02-19T02:00:00.000+00:00"]}}(加上上限)到管道
    • 非常感谢!我稍微改了一下,它对我有用。我想要 execution_time 作为条件 :) ``` db.mft_stats.aggregate([ { $unwind: "$device_execution" }, { $match: {"device_execution.execution_time" : {$gte: "2020-02-19T00:00:00.000+00:00",$lte : "2020-02-19T02:00:00.000+00:00"}} }, { $group: { _id: { ve_serial_number: "$ve_serial_number" }, "400": { $sum: "$device_execution.device_status.400" }, "200": { $sum: "$device_execution.device_status. 200" } } } ]) ```
    【解决方案2】:

    我认为您可以通过在“device_execution”字段中使用 $unwind aggregation 运算符来实现此目的

    然后你可以通过“ve_serial_number”和“device_status”$group它们并总结它们。

    【讨论】:

    • device_status 不是数组,因此 $unwind 没有任何意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多