Mongo MQL 按日期分组并添加其他字段值的计数

Mongo MQL group by date and add counts of other field values

我很难理解如何使用 MQL 查询我的数据。我的数据集看起来有点像这样:

{
    "_id": {
        "$oid": "5dcadda84d59f2e0b0d56974"
    },
    "object_kind": "pipeline",
    "object_attributes": {
        "status": "success",
        "created_at": "2019-11-12 16:28:22 UTC",
        "variables": []
    }
},
{
    "_id": {
        "$oid": "5dcadda84d59f2e0b0d56998"
    },
    "object_kind": "pipeline",
    "object_attributes": {
        "status": "failed",
        "created_at": "2019-11-13 12:22:22 UTC",
        "variables": []
    }
}

我正在添加 $eventDate 在我的聚合中使用它,这有效:

{
  eventDate: { $dateFromString: {
    dateString: {
      $substr: [ "$object_attributes.created_at",0, 10 ]
    }
  }},
}

我正试图把它变成这样:

{
    "eventDate": "2019-11-12",
    "counts": {
        "success": 1,
        "failure": 0
    }
},
{
    "eventDate": "2019-11-13",
    "counts": {
        "success": 0,
        "failure": 1
    }
},

到目前为止,我似乎无法理解如何将数据分组两次,就好像我按“$eventDate”分组然后我不能按状态分组一样。为什么我不能将同一 $eventDate 中的所有文档分组到一个数组中,而不丢失所有其他字段?

如果 successfailure 字段可以从 object_attributes.status

中出现的不同状态推断出来,那将是理想的

这可以通过几种不同的方式完成,下面是一个使用条件总和的简单示例:

db.collection.aggregate([
    {
        "$addFields": {
            "eventDate": {
                "$dateFromString": {
                    "dateString": {
                        "$substr": [
                            "$object_attributes.created_at",
                            0.0,
                            10.0
                        ]
                    }
                }
            }
        }
    },
    {
        "$group": {
            "_id": "$eventDate",
            "success": {
                "$sum": {
                    "$cond": [
                        {
                            "$eq": [
                                "$object_attributes.status",
                                "success"
                            ]
                        },
                        1.0,
                        0.0
                    ]
                }
            },
            "failure": {
                "$sum": {
                    "$cond": [
                        {
                            "$eq": [
                                "$object_attributes.status",
                                "failed"
                            ]
                        },
                        1.0,
                        0.0
                    ]
                }
            }
        }
    },
    {
        "$project": {
            "eventDate": "$_id",
            "counts": {
                "success": "$success",
                "failure": "$failure"
            },
            "_id": 0
        }
    }
]);