我的数据库中存储了具有完全相同“架构”的文档。每个文档都有三个浮点值(键是“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/