Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 同一文档中3个字段的平均值_Php_Mongodb_Aggregation Framework - Fatal编程技术网

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

Php 同一文档中3个字段的平均值,php,mongodb,aggregation-framework,Php,Mongodb,Aggregation Framework,我的数据库中存储的文档具有完全相同的“模式”。每个文档都有三个浮点值(键是‘A’、‘B’和‘C’),我需要做的是将每个文档输出为这三个值的平均值 我还需要除以100,所以我的计算是(A+B+C)/3/100。据我所知,我需要将每个文档作为不同的输出进行投影,但$group在这里是没有用的(因为我不是对所有文档进行平均,只是对每个文档进行平均) 我需要首先能够将其作为MongoDB命令编写,然后将其转换为PHP。我想我能够完成PHP部分,但我需要的是一些帮助,帮助我开始使用实际的MongoDB命令

我的数据库中存储的文档具有完全相同的“模式”。每个文档都有三个浮点值(键是‘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 }
{ "_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 }
当我提交get请求时,我需要的数据如下所示:

{ "_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 }
{ "_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()检索文档,会更好吗方法?

您基本上需要的是一个管道聚合-它将使用可用的为您计算平均值,并将修改同一管道中的结果,以获得作为计算表达式的字段
((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最好地执行其数据持久性任务。

从MongoDB 3.2开始,我们可以使用带方括号的累加器操作符
[]
在阶段中直接创建新的数组字段,以便高效地执行此操作

当然,我们还需要算术聚合操作符将值除以
100

db.measurements.aggregate(
    [ 
        { "$project": { 
            "result": { 
                "$divide": [
                    { "$avg": [ "$a", "$b", "$c" ] }, 
                    100 
                ] 
            } 
        }} 
    ]
)
PHP中的翻译提供:

db.measurements.aggregate(
    array(
        array("$project" => array( 
            "result" => array( 
                "$divide" => array(
                    "$avg" => array("$a", "$b", "$c"), 
                    100 
                )
            )
        ))
    )
)

请显示具有预期输出的示例文档。添加到原始PostThank chridam中。在添加到db之前,我最好在应用程序层中进行这些平均计算,并将它们作为附加字段存储。@ggwc无需担心。但不太确定这是否是您问题中的一个输入错误;您是否打算乘以100以获得percen您的预期输出所暗示的tage,或者计算结果与100除数一样正确?是的,它不是一个%。感谢您的帮助。不过,在3.2解决方案上的nice!