如何使用猫鼬聚合框架对数组元素进行分组

Bei*_*man 1 mongoose mongodb node.js mongodb-query aggregation-framework

我有以下猫鼬模式:

EmployeeSchema:

var EmployeeSchema = new Schema({
    name : String,
    employeeDetailsId: {
        type: Schema.Types.ObjectId,
        ref: 'employeedetails'
    }
});
Run Code Online (Sandbox Code Playgroud)

EmployeeDetailSchema:

var EmployeeDetailSchema = new Schema({
    employeeId: {
        type: Schema.Types.ObjectId,
        ref: 'employee'
    },
    statusId: {
        type: Schema.Types.ObjectId,
        ref: 'status'
    },
    primarySkills: [
    {
        type: Schema.Types.ObjectId,
        ref: 'skills'
    }]
});
Run Code Online (Sandbox Code Playgroud)

技能图式:

var SkillsSchema = new Schema({
    name: {
        type: String,
        required: true
    }
});
Run Code Online (Sandbox Code Playgroud)

以下是保存在EmployeeDetails集合中的数据:

/* 1 */
{
    "_id" : ObjectId("583fbbfe78854dd424f0523f"),
    "employeeId" : ObjectId("583f114e1cff44b7ab414dc1"),
    "statusId" : ObjectId("583ee05a1d5161941632091a"),
    "secondarySkills" : [],
    "primarySkills" : [],
    "__v" : 0
}

/* 2 */
{
    "_id" : ObjectId("583ff108cfa71d942269b09b"),
    "employeeId" : ObjectId("583f114e1cff44b7ab414dc4"),
    "statusId" : ObjectId("583ee05a1d5161941632091a"),
    "secondarySkills" : [],
    "primarySkills" : [],
    "__v" : 0
}

/* 3 */
{
    "_id" : ObjectId("5848c40599fa37d40a7e7392"),
    "employeeId" : ObjectId("583f114e1cff44b7ab414dc8"),
    "secondarySkills" : [ 
        ObjectId("5838373072d7bab017488ba2")
    ],
    "primarySkills" : [ 
        ObjectId("5848c3c299fa37d40a7e7390"), 
        ObjectId("5848c3d599fa37d40a7e7391")
    ],
    "__v" : 0
}

/* 4 */
{
    "_id" : ObjectId("5848c41699fa37d40a7e7393"),
    "employeeId" : ObjectId("583f114e1cff44b7ab414dc6"),
    "secondarySkills" : [],
    "primarySkills" : [ 
        ObjectId("5838373072d7bab017488ba2"), 
        ObjectId("5848c3c299fa37d40a7e7390"), 
        ObjectId("5848c3d599fa37d40a7e7391")
    ],
    "__v" : 0
}
Run Code Online (Sandbox Code Playgroud)

用例:

当我想根据状态ID对EmployeeDetails集合进行分组时,我在Mongoose中使用了以下聚合:

EmployeeDetailsModel.aggregate([
        {
            $group: {_id: "$statusId", count: {$sum: 1}}
        }
    ]).exec(...);
Run Code Online (Sandbox Code Playgroud)

以类似的方式,我想基于primarySkills或secondarySkills进行分组,它们两者都是Skill ObjectID的数组。

我尝试了几种方法,但是没有运气。需要一些帮助。

YLS*_*YLS 5

因此,如果您尝试获得显示具有一定技能的员工列表的结果,则$ unwind可能会有所帮助。

db.emp.aggregate([{$unwind:"$primarySkills"},{$group:{"_id":"$primarySkills", "employees":{$push:"$employeeId"}}}])
Run Code Online (Sandbox Code Playgroud)

结果如下:

{ "_id" : ObjectId("5848c3d599fa37d40a7e7391"), "employees" : [ ObjectId("583f114e1cff44b7ab414dc6"), ObjectId("583f114e1cff44b7ab414dc8") ] }
{ "_id" : ObjectId("5848c3c299fa37d40a7e7390"), "employees" : [ ObjectId("583f114e1cff44b7ab414dc6"), ObjectId("583f114e1cff44b7ab414dc8") ] }
{ "_id" : ObjectId("5838373072d7bab017488ba2"), "employees" : [ ObjectId("583f114e1cff44b7ab414dc6") ] }
Run Code Online (Sandbox Code Playgroud)

$开卷文档