【问题标题】:Mongo complex aggregate (condition based on group count)Mongodb复杂聚合(基于组数的条件)
【发布时间】:2017-06-23 21:14:38
【问题描述】:

我需要一个给定样本数据的 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,可能使用匹配阶段)并返回如下内容:

{    
    '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")
    ...
}

不返回。

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

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    通过使用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
        }
    })
    

    【讨论】:

    • mmm...这可能会...如果我想在结果中包含其他字段怎么办?
    • @Angelo 如果您想将字段添加为数组,请像 role 一样添加它,并添加投影。如果您修改您的问题并添加包含所有字段的文档结构会更好。
    • 所以每个字段都需要在前一阶段“声明”?如果我添加一个比赛阶段怎么办?我在比赛中没有使用的字段会在小组赛中使用吗?
    • 在组中您可以使用任何字段。但在这里,投影适用于 $group 结果,因此您可以使用 $group 中定义的文件。
    猜你喜欢
    • 1970-01-01
    • 2019-11-04
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 2022-08-23
    • 2018-10-31
    • 1970-01-01
    相关资源
    最近更新 更多