如何在 mongodb 中按多个字段聚合
How to aggregate by multiple fields in mongodb
我想按 2 个字段聚合并希望以嵌套方式完成 gouping。我如何实现它?目前我按以下方式进行分组
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是员工,部门1,部门2是部门。
如何聚合以获得嵌套结果?
我的原始文件是
[
{
"sector": "sector1",
"employee": "xyz"
},
{
"sector": "sector1",
"employee": "abc"
},
{
"sector": "sector1",
"employee": "abc"
},
{
"sector": "sector2",
"employee": "abc"
}
]
我希望结果是这样的形式
{abc:{sector1:2,sector2:2}, xyz: {sector1:1}}
不能在聚合框架中使用"data"作为"键名",也不能创建具有嵌套属性的嵌套对象。你也不应该想要,因为这是一个"反模式"。数据就是数据,应该保持这种状态。另外,还有更好的方法可以做到这一点:
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
}
]
}
]
因此,您有一个用于"员工"值的主分组键,其他结果被"推送"到数组中。
这是一个更好的结构,在键的命名中具有一致的结果。
相关文章:
- 如何访问对象内部的“categoryIds”字段/键,该对象包含mongodb's `ObjectId(s)`数
- MongoDB-通过比较集合和对象的数组来返回现有字段的数组
- 测试MongoDB中未设置或丢失的字段
- 将变量用作mongodb中字段名的一部分
- MongoDB聚合将两个不同的字段合并为一个并获取计数
- Selectize.js:如何将数据库中已经选择的标签预加载到输入字段(Meteor&MongoDB/JSON)
- mongodb mongodump json日期字段解析错误
- 将文档的MongoDB字段合并到一个文档中
- Mongodb按dbref字段分组
- 在document-mongoDB中设置一个字段
- 通过省略空格匹配字段-MongoDB
- 如何计算mongodb中两个集合中一个字段的不同值的数量
- 查找包含子对象MongoDb和Node.js的特定字段的文档
- 如何通过javascript使用mongose从mongoDB中获取字段的值
- 在MongoDB和Node.js中查找某个字段具有与对象完全相同元素的文档
- 可以't散列密码并将其设置为mongodb模式中的字段
- 查找Mongodb字段中出现次数最多的单词
- 我需要使用mongodb本机驱动程序来查找按时间戳字段排序的不同id
- MongoDB 字段永远不会为空
- 基于匹配查询更新所有文档和嵌入式文档中的字段.MongoDB NodeJS