我已经写了获取所有用户记录的查询
exports.index = function(req, res) {
Userdata.find(function(err, userdatas) {
if (err) {
return handleError(res, err);
}
console.log(userdatas);
});
};
控制台我收到文件
{
"_id" : ObjectId("584bc9ba420a6b189c510af6"),
"user_id" : 1,
"price" : 2000.0,
"type" : "credit",
},
{
"_id" : ObjectId("584bc9ba420a6b189c510af7"),
"user_id" : 1,
"price" : -1000.0,
"type" : "credit",
},
{
"_id" : ObjectId("584bc9ba420a6b189c510af8"),
"user_id" : 2,
"price" : 1000.0,
"type" : "credit",
}
现在我想计算总正数,总负数和总和(总正数 - 总负数)
一旦计算出我需要在汇总集合中插入/更新
如果用户ID已在摘要集合中显示,那么我们需要更新特定用户文档
如果用户ID不存在,我们需要为该用户创建新文档
此处摘要集合已经存在user_id = 1,因此我们需要更新此文档,而user_id = 2不在摘要集合中,因此我们需要创建。
{
"_id" : ObjectId("584bc9ba420a6b189c510af9"),
"user_id": 1,
"Totalpositiveprice": 3000.0,
"Totalnegativeprice": 0,
"Balanceprice": 3000.0
},
{
"_id" : ObjectId("584bc9ba420a6b189c510af9"),
"user_id": 3,
"Totalpositiveprice": 200.0,
"Totalnegativeprice": -190,
"Balanceprice": 10.0
}
我的期望结果:
{
"_id" : ObjectId("584bc9ba420a6b189c510af9"),
"user_id": "1",
"Totalpositiveprice": 5000.0,
"Totalnegativeprice": -1000.0,
"Balanceprice": 4000.0
},
{
"user_id": "2",
"Totalpositiveprice": 1000.0,
"Totalnegativeprice": 0,
"Balanceprice": 1000.0
},
{
"_id" : ObjectId("584bc9ba420a6b189c510af9"),
"user_id": 3,
"Totalpositiveprice": 200.0,
"Totalnegativeprice": -190,
"Balanceprice": 10.0
}
一旦计算出我需要在汇总集合中插入/更新
答案 0 :(得分:2)
考虑到预期结果是数字,db.getCollection('userpricing').aggregate([
{$group: {
_id:"$user_id",
user_id: {$first: "$user_id"},
Totalpositiveprice:{$sum:{$cond:[{ '$gt': ['$price', 0]}, "$price", 0]}},
Totalnegativeprice:{$sum:{$cond:[{ '$lt': ['$price', 0]}, "$price", 0]}},
Balanceprice:{"$sum":"$price"}}
},
{
$lookup:
{
from: "summary",
localField: "user_id",
foreignField: "user_id",
as: "user_id2"
}
},
{$project: {
_id:0,
user_id:1,
Totalpositiveprice: {$sum: ["$Totalpositiveprice", {$sum: "$user_id2.Totalpositiveprice"}] },
Totalnegativeprice: {$sum: ["$Totalnegativeprice", {$sum: "$user_id2.Totalnegativeprice"}] },
Balanceprice: {$sum: ["$Balanceprice", {$sum: "$user_id2.Balanceprice"}] },
}},
{$out: "summary"}
]).pretty()
集合中的值是数字(否则你需要使它们成为数字)这里是一个计算结果的聚合:
db.summary.find().pretty()
{
"_id" : ObjectId("584fde2906c7385883be0d15"),
"user_id" : 2,
"Totalpositiveprice" : 10000,
"Totalnegativeprice" : 0,
"Balanceprice" : 10000
}
{
"_id" : ObjectId("584fde2906c7385883be0d16"),
"user_id" : 1,
"Totalpositiveprice" : 23000,
"Totalnegativeprice" : -10000,
"Balanceprice" : 13000
}
结果:
SELECT * FROM mytable WHERE dt = <??? infitity ???> OR dt = <??? -infinity ???>
稍后,如果需要,您需要将它们转换为字符串。
注意:强> 结果它会使用新的计算(和更新)值覆盖摘要集合。 最好先测试你的结果。
答案 1 :(得分:1)
我假设你的summaryCollection中的字段是数字。您可以遍历userData并在摘要集合中修改或创建用户。我已添加到您现有的代码中:
pip install boto3
pip install django-storages==1.5.1 --> only version 1.5 and above have boto3 support.