Пн go MQL сгруппировать по дате и добавить количество значений других полей - PullRequest
1 голос
/ 03 февраля 2020

Я пытаюсь понять, как запрашивать мои данные с помощью 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 в массив, не теряя все остальные поля?

Было бы идеально, если бы поля success и failure могли быть выведены из разных статусов, которые появляются в object_attributes.status

1 Ответ

1 голос
/ 03 февраля 2020

Это можно сделать несколькими различными способами, вот быстрый пример с использованием условной суммы:

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
        }
    }
]);
...