Python 在聚合和倍增期间合并2个文档
我有以下记录:Python 在聚合和倍增期间合并2个文档,python,mongodb,aggregation-framework,pymongo,multiplication,Python,Mongodb,Aggregation Framework,Pymongo,Multiplication,我有以下记录: { "_id" : ObjectId("5a377b895a2840568b1034d5"), "reportId" : 1234, "quantity" : 346 }, { "_id" : ObjectId("5a377b935a2840568b1034d6"), "reportId" : 1234, "users" : 96 }, { "_id" : ObjectId("5a377ba35a2840568b1034d7"), "repo
{
"_id" : ObjectId("5a377b895a2840568b1034d5"),
"reportId" : 1234,
"quantity" : 346
},
{
"_id" : ObjectId("5a377b935a2840568b1034d6"),
"reportId" : 1234,
"users" : 96
},
{
"_id" : ObjectId("5a377ba35a2840568b1034d7"),
"reportId" : 2345,
"quantity" : 566
},
{
"_id" : ObjectId("5a377bac5a2840568b1034d8"),
"reportId" : 2345,
"users" : 66
}
我希望最终输出是这样的:
{'reportId': 1234, 'total':quantity * users}
换句话说,我希望总数是用户和数量的乘积
我尝试了以下方法:
db.test1.aggregate([
{'$group':
{ '_id':'$reportId',
'total':{'$multiply':['$users','$quantity']}
}
}])
这会导致以下错误:
assert: command failed: {
"ok" : 0,
"errmsg" : "The $multiply accumulator is a unary operator",
"code" : 40237,
"codeName" : "Location40237"
} : aggregate failed
所以接下来我尝试了这个:
db.test1.aggregate([ {
'$group':
{ '_id':'$reportId',
'document':{'$push':{'reportId':'$reportId',
'quantity':'$quantity','users':'$users'}}}},
{'$unwind':'$document'}])
这给了我:
{ "_id" : 2345, "document" : { "reportId" : 2345, "quantity" : 566 } }
{ "_id" : 2345, "document" : { "reportId" : 2345, "users" : 66 } }
{ "_id" : 1234, "document" : { "reportId" : 1234, "quantity" : 346 } }
{ "_id" : 1234, "document" : { "reportId" : 1234, "users" : 96 } }
我的目标是合并两个记录并应用乘法。
有没有可能在mongoDB聚合中这样做,而不是得到一个中间答案,循环遍历部分结果并完成工作?你几乎做到了,
$group
是一个很好的方法。这样的办法应该行得通
db.test1.aggregate([
{"$group":
{
"_id": "$reportId",
"usr": {"$sum": "$users"},
"qty": {"$sum": "$quantity"}
}
},
{"$project":
{
"_id": 0,
"reportId": "$_id",
"total": {"$multiply": ["$usr", "$qty"]}
}}
])
首先,我们将所有
用户
和数量
合并,然后将它们相乘。在分组
阶段,您需要累积所需的指标。您几乎做到了,$group
是一个很好的方法。这样的办法应该行得通
db.test1.aggregate([
{"$group":
{
"_id": "$reportId",
"usr": {"$sum": "$users"},
"qty": {"$sum": "$quantity"}
}
},
{"$project":
{
"_id": 0,
"reportId": "$_id",
"total": {"$multiply": ["$usr", "$qty"]}
}}
])
首先,我们将所有
用户
和数量
合并,然后将它们相乘。在分组
阶段,您需要累积所需的指标。您几乎做到了正确。我使用此解决方案来组合两个字段的值:
db.test1.aggregate([
{"$group":{
"_id":"$reportId",
"qtd":{$sum:"$quantity"},
"usrs":{$sum:"$users"}
}},
{"$project":{
"_id":0,
"reportId":"$_id",
"total":
{$multiply:["$qtd","$usrs"]}
}}
])
希望我的回答有帮助。你几乎答对了。我使用此解决方案来组合两个字段的值:
db.test1.aggregate([
{"$group":{
"_id":"$reportId",
"qtd":{$sum:"$quantity"},
"usrs":{$sum:"$users"}
}},
{"$project":{
"_id":0,
"reportId":"$_id",
"total":
{$multiply:["$qtd","$usrs"]}
}}
])
希望我的回答有帮助。错误消息:“errmsg”:“无法识别的表达式'$push'”,“代码”:168,“代码名”:“InvalidPipelineOperator”@israel.um,检查时间戳。是的。删除$push可以使它工作。谢谢:)嗯……没关系。我们都能解决这个问题。我会对你的答案投赞成票,因为它也是正确的。男人们对你的两个答案都投了赞成票。。。只要它解决了问题就没有问题。感谢您的时间:)错误消息:“errmsg”:“无法识别的表达式'$push'”,“code”:168,“codeName”:“InvalidPipelineOperator”@israel.zing umm,检查时间戳。是的。删除$push可以使它工作。谢谢:)嗯……没关系。我们都能解决这个问题。我会对你的答案投赞成票,因为它也是正确的。男人们对你的两个答案都投了赞成票。。。只要它解决了问题就没有问题。谢谢您的时间:)是的,早期的解决方案中有$push,导致了错误。这是有效的:)如果我的答案有帮助,请接受/更新我的答案。是的,早期的解决方案中有$push导致错误。如果我的回答有帮助,请接受/支持我的回答。