Javascript 如何在mongodb中按多个字段进行聚合
我想聚集2个字段,并希望有一个嵌套的方式进行凿。我如何做到这一点?目前,我以以下方式进行分组Javascript 如何在mongodb中按多个字段进行聚合,javascript,node.js,mongodb,mongodb-query,aggregation-framework,Javascript,Node.js,Mongodb,Mongodb Query,Aggregation Framework,我想聚集2个字段,并希望有一个嵌套的方式进行凿。我如何做到这一点?目前,我以以下方式进行分组 var query = [ { '$group': { '_id': { 'employee': '$employee', 'sector': '$sector' }, 'bookCount': { '$sum': 1 } }}, { '$sort': { 'count': -1 } } ]; Order.aggregate(query, f
var query = [
{ '$group': {
'_id': {
'employee': '$employee',
'sector': '$sector'
},
'bookCount': { '$sum': 1 }
}},
{ '$sort': { 'count': -1 } }
];
Order.aggregate(query, function(err, results){
res.json(results)
});
我希望结果以表格形式显示
{abc:{sector1:4, sector3:5}, xyz: {sector1:10, sector2:23}}
其中abc、xyz为员工,sector1、sector2为部门
如何聚合以获得嵌套结果
我的原始文件是
[
{
"sector": "sector1",
"employee": "xyz"
},
{
"sector": "sector1",
"employee": "abc"
},
{
"sector": "sector1",
"employee": "abc"
},
{
"sector": "sector2",
"employee": "abc"
}
]
我希望结果是这样的
{abc:{sector1:2,sector2:2}, xyz: {sector1:1}}
不能在聚合框架中将“数据”用作“键名”,也不能创建具有嵌套属性的嵌套对象。你也不应该这样做,因为这是一种“反模式”。数据就是数据,应该保持这种状态。此外,还有更好的方法:
Order.aggregate([
{ "$group": {
"_id": {
"employee": "$employee",
"sector": "$sector"
},
"count": { "$sum": 1 }
}},
{ "$group": {
"_id": "$_id.employee",
"sectors": {
"$push": {
"sector": "$_id.sector",
"count": "$count"
}
}
}}
],function(err,docs) {
});
返回如下结构:
[
{
"_id" : "xyz",
"sectors" : [
{
"sector" : "sector1",
"count" : 1
}
]
},
{
"_id" : "abc",
"sectors" : [
{
"sector" : "sector2",
"count" : 1
},
{
"sector" : "sector1",
"count" : 2
}
]
}
]
因此,您有一个用于“employee”值的主分组键,其他结果被“推”到一个数组中
这是一种更好的结构,在密钥命名方面具有一致的结果。显示原始文档。为什么将嵌套模式称为“反模式”?我试着使用那个表格,因为从使用的角度来看,它似乎更方便。使用数据值作为键名不是正确的做法吗?在我发布了这个问题之后,我编写了一些代码来处理聚合返回的数据,并以嵌套格式返回到client@raju将东西移动到“关键点”中(显然是数据)是不好的做法。好的对象有一个一致的属性接口,而不是一个总是变化的接口。列表属于数组。在单个对象中列出大量属性,并使用所需的“唯一”名称,以便能够做到这一点,这是不好的。