Mongodb Mongo聚合分组子文档
我一直在用MongoDB的聚合框架做一些看似简单的事情 想象一下,您的文档如下所示:Mongodb Mongo聚合分组子文档,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,我一直在用MongoDB的聚合框架做一些看似简单的事情 想象一下,您的文档如下所示: [ { a: 1, b: 2 }, { a: 1, b: 3 }, { a: 5, b: 6 } ] printjson(db.getSiblingDB('mydb').mycollection.aggregate([ { $project: { a: 1, b: 1 } }, {
[
{ a: 1, b: 2 },
{ a: 1, b: 3 },
{ a: 5, b: 6 }
]
printjson(db.getSiblingDB('mydb').mycollection.aggregate([
{
$project: {
a: 1,
b: 1
}
},
{
$group: {
_id: {
a: '$a'
},
sum_a: {
$sum: 1
},
b: {
$first: '$b'
}
}
},
{
$group: {
_id: {
b: '$b'
},
sum_b: {
$sum: 1
}
}
},
{
$sort: {
sum_a: 1
}
}
]));
- 如何按字段
对文档进行分组,然后按另一个字段(如a
)重新分组子文档,同时仍计算每个步骤的文档总数b
{
results: [
{
_id: {
a: 1
},
sum_a: 2,
doc_a: [
{
_id: {
b: 2
},
sum_b: 1
},
{
_id: {
b: 3
},
sum_b: 1
}
]
},
{
_id: {
a: 5
},
sum_a: 1,
doc_a: [
{
_id: {
b: 6
},
sum_b: 1
}
]
}
]
}
我试过这样的方法:
[
{ a: 1, b: 2 },
{ a: 1, b: 3 },
{ a: 5, b: 6 }
]
printjson(db.getSiblingDB('mydb').mycollection.aggregate([
{
$project: {
a: 1,
b: 1
}
},
{
$group: {
_id: {
a: '$a'
},
sum_a: {
$sum: 1
},
b: {
$first: '$b'
}
}
},
{
$group: {
_id: {
b: '$b'
},
sum_b: {
$sum: 1
}
}
},
{
$sort: {
sum_a: 1
}
}
]));
但在我做的不同测试中,它总是覆盖以前的小组阶段结果,错误地计算总数等等
因此,我真的不知道如何解决这个问题。如果您按主字段('a')和子字段('b')分组,然后只按'a'(第一步的计数求和)分组,并将'b'推入数组(从第一步复制计数),它应该会产生您需要的结果:
{
$group : {
_id : {
a : '$a',
b : '$b'
},
count : {
$sum : 1
}
}
},{
$group : {
_id : {
a : '$_id.a'
},
count_a : {$sum: '$count'},
doc_a : {
$push : {
b : '$_id.b',
count_b : '$count'
}
}
}
}