Php 如何对odm中的多个字段求和?
我想使用doctrine odm的聚合生成器构建此查询:Php 如何对odm中的多个字段求和?,php,doctrine,doctrine-odm,Php,Doctrine,Doctrine Odm,我想使用doctrine odm的聚合生成器构建此查询: db.TeamStandings.aggregate( // Pipeline [ // Stage 1 { $match: { "team.$id": ObjectId("5a1643fdf5d8741a883c2aeb") } }, // Stage 2 {
db.TeamStandings.aggregate(
// Pipeline
[
// Stage 1
{
$match: {
"team.$id": ObjectId("5a1643fdf5d8741a883c2aeb")
}
},
// Stage 2
{
$group: {
"_id": { "team": "team.$id" },
// This is the sum of multiple fields
"games": { $sum: { $sum: ["$wins", "$losses", "$ties"] } },
"wins": { $sum: "$wins" },
"losses": { $sum: "$losses" },
"ties": { $sum: "$ties" },
"homeWins" : { $sum: "$homeRecord.wins" },
"homeLosses" : { $sum: "$homeRecord.losses" },
"homeTies" : { $sum: "$homeRecord.ties" },
"roadWins" : { $sum: "$roadRecord.wins" },
"roadLosses" : { $sum: "$roadRecord.losses" },
"roadTies" : { $sum: "$roadRecord.ties" },
}
},
]
);
我在Studio3T中执行了此操作,并得到以下结果:
{
"_id" : {
"team" : "team.$id"
},
"games" : NumberInt(776),
"wins" : NumberInt(377),
"losses" : NumberInt(398),
"ties" : NumberInt(1),
"homeWins" : NumberInt(218),
"homeLosses" : NumberInt(170),
"homeTies" : NumberInt(1),
"roadWins" : NumberInt(159),
"roadLosses" : NumberInt(228),
"roadTies" : NumberInt(0)
}
如何使用doctrine odm的聚合生成器编写这个精确的查询?这个查询很棘手,因为文档不太清楚 理论上,可以创建嵌套子表达式并在其中使用sum运算符:
$builder = $this->dm->createAggregationBuilder(\Documents\BlogPost::class);
$builder->group()
->field('id')
->expression(null)
->field('games')
->sum($builder->expr()->sum('$wins', '$losses', '$ties'))
;
但是,由于聚合生成器的构建方式,它不太理解在$project
阶段之外使用多个表达式的sum语法
,导致以下(错误)结果:
要解决此问题,请在嵌套表达式中使用$add
运算符,而不是$sum
:
$builder = $this->dm->createAggregationBuilder(\Documents\BlogPost::class);
$builder->group()
->field('id')
->expression(null)
->field('games')
->sum($builder->expr()->add('$wins', '$losses', '$ties'))
;
这将创建您希望它创建的聚合管道
这很奇怪,因为文档定义了$sum
在$group
和$project
阶段使用时的不同行为:在$group
中,它接受一个参数,而在$project
中,它接受多个参数。但是,它在$group
中的嵌套表达式中的行为并不十分清楚:您发布的聚合管道工作的事实表明它没有将子表达式视为在$group
阶段中,因此允许多个参数。当我构建操作符时,我假设了相反的情况:只有在$project
阶段$sum
接受多个参数,否则默认为一个参数语法
我将在MongoDB ODM中为此创建一个记录单,并查看是否可以轻松解决此问题。聚合生成器上有大量文档:信不信由你,我已经访问过该页面很多次了。这就是我开始使用聚合生成器的原因。然而,我没有看到它涵盖了将多个字段相加的内容。我正在寻找的具体案例是如何在条令odm:
“游戏”中编写此代码:{$sum:{$sum:{$sum:[“$wins”、“$loss”、“$ties”]},
在深入挖掘条令odmsum()
code之后,doc块表示:计算并返回将指定表达式应用于共享同一分组键的文档组中的每个文档所产生的所有数值之和。忽略非数值。
但似乎不是;或者更可能的是,我不了解聚合生成器。您可能想更新问题,说明您在ODM方面遇到的问题-到目前为止,它看起来像是“我没有尝试过,但请将此查询重写为PHP”,使用->add(…)
有效!非常感谢。谢谢你制作了一张票。你能发布你创建的票证的链接吗?这样我就可以跟踪了?谢谢。当然,给你:
$builder = $this->dm->createAggregationBuilder(\Documents\BlogPost::class);
$builder->group()
->field('id')
->expression(null)
->field('games')
->sum($builder->expr()->add('$wins', '$losses', '$ties'))
;