php - 同一文档中 3 个字段的平均值

标签 php mongodb aggregation-framework

我的数据库中存储了具有完全相同“架构”的文档。每个文档都有三个浮点值(键是“A”、“B”和“C”),我需要做的是将每个文档输出为所有三个值的平均值。

我还需要除以 100,所以我的计算是 (A + B + C)/3/100。据我所知,我需要将每个文档投影为不同的输出,但是 $group 在这里没有用(因为我没有对所有文档进行平均,只是对每个文档进行平均)。

我需要首先能够将其编写为 MongoDB 命令,然后再将其转换为 PHP。我想我可以完成 PHP 部分,但我需要的是一些帮助开始实际的 MongoDB 命令...

db.measurements.aggregate(   )

我的数据存储如下:

{ "_id" : ObjectId(xxx), "A": 22.34, "B": 23.32, "C": 75.32, "device_id": 3 }
{ "_id" : ObjectId(xxx), "A": 22.34, "B": 23.32, "C": 75.32, "device_id": 3 }
{ "_id" : ObjectId(xxx), "A": 22.34, "B": 23.32, "C": 75.32, "device_id": 3 }

当我提交一个get请求时,我需要我的数据出来如下:

{ "_id" : ObjectId(xxx), "Average of A,B,C": 40.50, "device_id": 3 }
{ "_id" : ObjectId(xxx), "Average of A,B,C": 40.50, "device_id": 3 }
{ "_id" : ObjectId(xxx), "Average of A,B,C": 40.50, "device_id": 3 }

经过进一步研究,似乎聚合不是我应该在这里使用的方法?如果我在插入数据库之前计算我的 php 模型中的平均值,然后通过 find() 方法检索我的文档,会更好吗?

最佳答案

您本质上需要的是一个 $project 管道聚合 - 它将使用 arithmetic operators 为您计算平均值 可用并将修改同一管道内的结果以获取字段作为计算表达式 ((A + B + C)/3)/100(如果您想要百分比那么您需要乘法而不是除法,即计算是 ((A + B + C)/3)*100)。通过以下操作概括解释:

db.measurements.aggregate([
    {
        "$project": {               
            "device_id": 1,
            "Average of A,B,C": {
                "$divide": { // ( A + B + C )/3 )/100
                    {
                        "$divide": [ // (A + B + C )/3
                            { "$add": [ "$A", "$B", "$C" ] }, // A + B + C
                            3
                        ]
                    },
                    100
                }
            }
        }
    }
])

话虽这么说,最好在应用层做繁重或复杂的计算任务,让 mongo 最好地做它的数据持久化任务。

关于php - 同一文档中 3 个字段的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37704784/

相关文章:

html - 如何使用node/express从现有的mongodb集合中读取数据并将其显示在浏览器上?

node.js - 通过值或变量设置项目阶段键

php - 警告 : file_get_contents: failed to open stream: Redirection limit reached, 中止

php - 如何对使用 mysql 查询但使用 PHP usort 函数排序的项目进行分页?

python - pymongo update_one 不更新基于 _id

mongodb - Mongoose 仅​​从数组中获取特定对象,如果没有则为空数组

java - 是否可以在 mongo 的组聚合后重命名 _id 字段?

java - 在 PHP 中嵌入 Java

php - Carbon 语言环境不被尊重?

mongodb - 为什么新建模型时需要指定名称?