我想从MongoDB聚合中的组管道中获取百分比。
我的数据:
{
_id : 1,
name : 'hello',
type : 'big'
},
{
_id : 2,
name : 'bonjour',
type : 'big'
},
{
_id : 3,
name : 'hi',
type : 'short'
},
{
_id : 4,
name : 'salut',
type : 'short'
},
{
_id : 5,
name : 'ola',
type : 'short'
}
我的请求组按类型计算:
[{
$group : {
_id : {
type : '$type'
},
"count" : {
"$sum" : 1
}
}
}]
结果:
[
{
_id {
type : 'big',
},
count : 2
},
{
_id {
type : 'short',
},
count : 3
}
]
但我想要计算AND百分比,就像那样:
[
{
_id {
type : 'big',
},
count: 2,
percentage: 40%
},
{
_id {
type : 'short',
},
count: 3,
percentage: 60%
}
]
但我不知道该怎么做。我尝试过$divide
等事情,但没有成功。你能帮我吗?
答案 0 :(得分:7)
我认为如果值包含percentage
%
应为字符串
首先,你需要count
文件的数量。
var nums = db.collection.count();
db.collection.aggregate(
[
{ "$group": { "_id": {"type": "$type"}, "count": { "$sum": 1 }}},
{ "$project": {
"count": 1,
"percentage": {
"$concat": [ { "$substr": [ { "$multiply": [ { "$divide": [ "$count", {"$literal": nums }] }, 100 ] }, 0,2 ] }, "", "%" ]}
}
}
]
)
结果
{ "_id" : { "type" : "short" }, "count" : 3, "percentage" : "60%" }
{ "_id" : { "type" : "big" }, "count" : 2, "percentage" : "40%" }
答案 1 :(得分:3)
首先使用count
方法查找集合中的文档总数,并使用该count变量计算集合中的percentage
,如下所示:
var totalDocument = db.collectionName.count() //count total doc.
在汇总中使用totalDocument
,如下所示:
db.collectionName.aggregate({"$group":{"_id":{"type":"$type"},"count":{"$sum":1}}},
{"$project":{"count":1,"percentage":{"$multiply":[{"$divide":[100,totalDocument]},"$count"]}}})
修改强>
如果您需要在单aggregation
个查询中进行此操作,那么unwind
在聚合中使用但使用unwind
则会创建Cartesian problem
以下聚合查询:
db.collectionName.aggregate({"$group":{"_id":null,"count":{"$sum":1},"data":{"$push":"$$ROOT"}}},
{"$unwind":"$data"},
{"$group":{"_id":{"type":"$data.type"},"count":{"$sum":1},
"total":{"$first":"$count"}}},
{"$project":{"count":1,"percentage":{"$multiply":[{"$divide":[100,totalDocument]},"$count"]}}}
).pretty()
我重新考虑先找出toatal计数,然后根据第一次查询在聚合中使用该计数。