假设我的文件很少
{
"_id" : ObjectId("5ecce1f9cb4a5d097c9061c8"),
"job_id" : 1,
"score" : 2
},
{
"_id" : ObjectId("5ecce200cb4a5d097c9061cb"),
"job_id" : 1,
"score" : 1
},
{
"_id" : ObjectId("5ecce206cb4a5d097c9061ce"),
"job_id" : 1,
"score" : 2
},
{
"_id" : ObjectId("5ecce210cb4a5d097c9061d3"),
"job_id" : 1,
"score" : 0
},
{
"_id" : ObjectId("5ecce21acb4a5d097c9061d6"),
"job_id" : 2,
"score" : 2
},
{
"_id" : ObjectId("5ecce224cb4a5d097c9061df"),
"job_id" : 2,
"score" : 0
},
{
"_id" : ObjectId("5ecce230cb4a5d097c9061e2"),
"job_id" : 2,
"score" : 0
},
{
"_id" : ObjectId("5ecce239cb4a5d097c9061e5"),
"job_id" : 2,
"score" : 0
}
我如何根据他们的job_id对他们进行分组,并获得出现分数的汇总结果?像这样:
{
"job_id": 1,
"result": {
0:1,
1:1,
2:2
}
},
{
"job_id": 2,
"result": {
0:3,
2:1
}
}
由于job_id 2,O发生3次,2发生1次,因此,此结果。
我尝试了许多不同的方法并尝试进行分组,但没有帮助。
[如果您使用的是Mongo 4.0+,则可以使用以下聚合,该聚合利用$arrayToObject来操纵数据结构。我们需要Mongo版本4.0的原因是管道中$toString的使用,因为对象键的限制必须键入字符串才能使$arrayToObject
正常工作。
db.collection.aggregate([
{
$group: {
_id: {job: "$job_id", score: "$score"},
count: {$sum: 1}
}
},
{
$group: {
_id: "$_id.job",
scoreResults: {$push: {v: "$count", k: {$toString: "$_id.score"}}}
}
},
{
$project: {
_id: 0,
job_id: "$_id",
result: {$arrayToObject: "$scoreResults"}
}
}
])