Mongo 复杂聚合(基于组计数的条件)

Mongo complex aggregate (condition based on group count)

我需要一个 mongo 给定样本数据的集合:

{
    'employeeNumber': '1',
    'companyId': '1',
    'role': 'D',
    'dateHired':ISODate("2013-11-26T00:00:00.0Z")
    ...
}
{
    'employeeNumber': '1',
    'companyId': '1',
    'role': 'S',
    'dateHired':ISODate("2013-11-26T00:00:00.0Z")
    ...
}
{
    'employeeNumber': '1',
    'companyId': '2',
    'role': 'D',
    'dateHired':ISODate("2013-11-26T00:00:00.0Z")
    ...
}
{
    'employeeNumber': '2',
    'companyId': '1',
    'role': 'D',
    'dateHired':ISODate("2013-11-26T00:00:00.0Z")
    ...
}

查询给定的 companyId(例如 companyId = 1,可能使用匹配阶段)并且 return 类似于:

{    
    'employeeNumber': '1',
    'companyId': '1',
    'role': 'D','S'
    'dateHired':ISODate("2013-11-26T00:00:00.0Z")
    ...
}

注意

{    
    'employeeNumber': '1',
    'companyId': '2',
    'role': 'D'
    'dateHired':ISODate("2013-11-26T00:00:00.0Z")
    ...
}

未被 return编辑。

理想情况下 return 整个对象,因为集合有 10/12 个字段。

通过使用 aggregation 你不会得到准确的预期输出,但你可以获得如下输出:

{ "role" : [ "D" ], "employeeNumber" : "2" }
{ "role" : [ "S" ], "employeeNumber" : "3" }
{ "role" : [ "D", "S" ], "employeeNumber" : "1" }

查询将是这样的:

db.collection.aggregate({
    $group: {
    _id: "$employeeNumber",
    "role": {
        "$push": "$role"
    }
    }
}, {
    $project: {
    "employeeNumber": "$_id",
    "role": 1,
    "_id": 0
    }
})

编辑 问题编辑后:

db.collection.aggregate({
    $group: {
    _id: {
        employeeNumber: "$employeeNumber",
        "companyId": "$companyId"
    },
    "role": {
        "$push": "$role"
    },
    "dateHired": {
        $last: "$dateHired"
    }
    }
}, {
    $project: {
    "employeesNumber": "$_id.employeeNumber",
    "comapnyId": "$_id.companyId",
    "role": 1,
    "dateHired": 1,
    "_id": 0
    }
})