Php 过滤数组mongodb的过滤数组和$sum-up字段

Php 过滤数组mongodb的过滤数组和$sum-up字段,php,mongodb,mongodb-query,aggregation-framework,Php,Mongodb,Mongodb Query,Aggregation Framework,对不起,我不知道如何更好地表达这个问题 我试图计算MongoDB文档中图书项目的总花费。这意味着在计算数组之前,必须对其进行过滤,在计算总花费时只考虑购买的书籍 这是一个示例文档(我删除了一些字段,所以它不会变得太大): { “_id”:ObjectId(“598cb3f4ca693a0688004e2a”), “标题”:{ “德”:“另一个”, “ja”:アナザー", “roomaji”:“另一个” }, “总数”:4, “卷”:[ { "卷":一,, “版本”:1, “价格”:7, “发布日

对不起,我不知道如何更好地表达这个问题

我试图计算MongoDB文档中图书项目的总花费。这意味着在计算数组之前,必须对其进行过滤,在计算总花费时只考虑购买的书籍

这是一个示例文档(我删除了一些字段,所以它不会变得太大):

{
“_id”:ObjectId(“598cb3f4ca693a0688004e2a”),
“标题”:{
“德”:“另一个”,
“ja”:アナザー",
“roomaji”:“另一个”
},
“总数”:4,
“卷”:[
{
"卷":一,,
“版本”:1,
“价格”:7,
“发布日期”:1342051200,
“买的”:没错,
“阅读”:正确
}, 
{
“卷”:2,
“版本”:1,
“价格”:7,
“发布日期”:1347494400,
“买的”:没错,
“阅读”:正确
}, 
{
“卷”:3,
“版本”:1,
“价格”:7,
“发布日期”:1352419200,
“买的”:假的,
“读取”:错误
}, 
{
“卷”:4,
“版本”:1,
“价格”:7,
“发布日期”:1357776000,
“买的”:假的,
“读取”:错误
}
],
“发布年份”:2012年
}
因此,我希望对所有volume对象的价格字段求和,但仅对那些“Bunded”设置为true的对象求和。因此,我希望得到以下输出:

{
“_id”:ObjectId(),
“标题”:{
“de”:“title”
},
“计数”:14
}
这是我的PHP代码

$result=$mongo->Book->aggregate([
[
“$group”=>[
“\u id”=>“$\u id”,
'title'=>['$push'=>'$title.de'],
“计数”=>[
“$sum”=>[
“$map”=>[
'输入'=>'$volumes',
'作为'=>'卷',
'在'=>[
“$cond”=>[
[
“$eq”=>[“$$vol.bunded”,真]
],
“$$vol.price”,
0
]
]
],
]
]
]
],
[
“$sort”=>[
“计数”=>-1
]
]
]);

但是count总是返回0。我做错了什么?

它总是返回0,因为管道步骤中的运算符需要一个计算结果为数值的表达式,而这里提供的表达式计算结果为数组。还有中的
值运算符是应用于输入数组的每个元素的表达式,它使用
中指定的变量名作为
单独引用每个元素,因此不涉及筛选,因为运算符在这里是多余的

您需要先使用过滤数组,然后才能映射元素。幸运的是操作符可以在阶段中使用,因为它返回每个文档的指定表达式列表的总和

考虑运行以下管道以获得所需结果:

$result = $mongo->Book->aggregate([
    [
        "$project" => [
            "title.de" => "$title.de",
            "count" => [
                "$sum" => [
                    "$map" => [
                        "input" => [
                            "$filter" => [
                                "input" => "$volumes",
                                "as" => "vol",
                                "cond" => "$$vol.bought"
                            ]
                        ],
                        "as" => "el",
                        "in" => "$$el.price"
                    ]
                ]
            ]
        ]
    ],
    [
        '$sort' => [
            'count' => -1
        ]
    ]
])