Roh*_*ala 7 mongoose mongodb node.js aggregation-framework
我们有一个聚合查询,可以预测几个子文档.我们想在这些预测值上应用Sum和Product等几个算术运算.
聚合查询 -
Item.aggregate([
{ $unwind: '$dummy'},
{ $match: {'dummy.storage': {$gt: 0}} },
{ $group: {_id: '$_id',
dummy: {$push: '$dummy'},
original_y: { $first: "$original_y" },
new_y: { $first: "$new_y" },
}},
{$project:{
original_y: 1, new_y: 1,
tallyAmount: {$sum: ["$new_y","$original_y"] }
}
},
]
)
.exec(function(err, results){
if(err)
{
console.log("Error : " + err);
return res.json ({error: "Error"});
}
else if(!(results) || results == null || results.length == 0)
{
console.log("No Results Found");
return res.json ({error: "No Results Today"});
}else{
res.send(results);
}
});
Run Code Online (Sandbox Code Playgroud)
这给出了一个错误说明
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},
]
}
Run Code Online (Sandbox Code Playgroud)
输出预期:
{
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},
]
}
Run Code Online (Sandbox Code Playgroud)
哪里,
tallyAmount = (original_y + new_y) / cost
错误:无法为虚拟子字段添加表达式,因为已存在适用于整个字段的表达式
如果没有文档架构的详细信息和预期的聚合结果,我建议您尝试以下聚合,因为我认为您需要$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);
Run Code Online (Sandbox Code Playgroud)
- 更新 -
要满足条件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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
892 次 |
| 最近记录: |