我们有一个聚合查询,可以预测几个子文档。我们想在这些预测值上应用Sum和Product等几个算术运算。
汇总查询 -
invalid operator '$sum'
这给出了一个错误说明
original_y
我们应该怎样做才能在new_y
中获得$project
和{
id:1,
original_y: 200,
new_y: 140,
dummy: [
{id:1, storage:2, cost: 10},
{id:2, storage:0, cost: 20},
{id:3, storage:5, cost: 30},
]
}
的总和?
修改
文件:
{
id:1,
original_y: 200,
new_y: 140,
dummy: [
{id:1, storage:2, cost: 10, tallyAmount: 34},
{id:3, storage:5, cost: 30, tallyAmount: 11.33},
]
}
输出预期:
tallyAmount = (original_y + new_y) / cost
其中,
private static function get_defaults() {
$defauls = array(
'title' => '' ,
'subtitle' => '' ,
'columns' => '4' ,
'ntax' => '' ,
'showposts' => '12' ,
'imagesize' => 'medium' ,
'posttype' => '' ,
'exclude' => '' ,
'terms' => '' ,
'border' => '' ,
'padding' => ''
);
return $defaults;
}
/**
* Generates the administration form for the widget.
*
* @param array instance The array of keys and values for the widget.
*/
public function form( $instance ) {
$instance = wp_parse_args(
(array)$instance,self::get_defaults()
);
错误:无法为虚拟子字段添加表达式,因为已存在适用于整个字段的表达式
答案 0 :(得分:5)
如果没有文档架构的详细信息和预期的聚合结果,我建议您尝试以下聚合,因为我认为您需要$add
运算符而不是$sum
运算符。请注意,$sum
运算符仅适用于$group
运算符。使用$add
运算符,它将两个数字/字段相加,并将结果存储在$project
运算符的新字段中:
Item.aggregate([
{ "$match": { "dummy.storage": { "$gt": 0 } } },
{ "$unwind": "$dummy" },
{ "$group": {
"_id": "$_id",
"original_y": { "$first": "$original_y" },
"new_y": { "$first": "$new_y" }
} },
{ "$project": {
"original_y": 1,
"new_y": 1,
"tallyAmount": { "$add": [ "$new_y", "$original_y" ] }
} }
]).exec(callback);
- 更新 -
要满足条件tallyAmount = (original_y + new_y) / cost
,您应该在$ project运算符管道阶段使用$add
和$divide
算术运算符,这样您的最终聚合管道将如下所示:
Item.aggregate([
{ "$match": { "dummy.storage": { "$gt": 0 } } },
{ "$unwind": "$dummy" },
{
"$project": {
"original_y": 1,
"new_y": 1,
"dummy.id": "$dummy.id",
"dummy.storage": "$dummy.storage",
"dummy.cost": "$dummy.cost",
"dummy.tallyAmount": {
"$divide": [
{ "$add": ["$new_y","$original_y"] },
"$dummy.cost"
]
}
}
},
{
"$group": {
"_id": "_$id",
"original_y": { "$first": "$original_y" },
"new_y": { "$first": "$new_y" },
"dummy": {
"$addToSet": "$dummy"
}
}
}
]).exec(callback);