MongoDB Aggregation - создание новых массивов из заданного массива - PullRequest
0 голосов
/ 09 мая 2018

Я хочу создать новые массивы из данного массива на основе результатов агрегации, желаемый результат из следующего документа - разделить массив на новые массивы, где точкой разделения является действие "start"

{
    "_id" : "5f851b06b08ab4b1f916c14841d4bbba",
    "actions" : [
        {
            "action" : "start",
            "datetime" : 1525692527345.0
        },
        {
            "action" : "scrolled",
            "datetime" : 1525692545966.0
        },
        {
            "action" : "scrolled",
            "datetime" : 1525692545983.0
        },
        {
            "action" : "click",
            "datetime" : 1525692545999.0
        },
        {
            "action" : "start",
            "datetime" : 1525693343877.0
        },
        {
            "action" : "mousemove",
            "datetime" : 1525693351075.0
        },
        {
            "action" : "mousemove",
            "datetime" : 1525693351117.0
        },
        {
            "action" : "scrolled",
            "datetime" : 1525693351212.0
        },
        {
            "action":   "scrolled",
            "datetime": 1525693354026.0
        },
        {
            "action":   "scrolled",
            "datetime": 1525693354126.0
        }
    ]
}

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

{
    "_id":      "5f851b06b08ab4b1f916c14841d4bbba",
    "session1": [
        {
            "action":   "start",
            "datetime": 1525692527345.0
        },
        {
            "action":   "scrolled",
            "datetime": 1525692545966.0
        },
        {
            "action":   "scrolled",
            "datetime": 1525692545983.0
        },
        {
            "action":   "click",
            "datetime": 1525692545999.0
        }
    ],
    "session2": [
        {
            "action":   "start",
            "datetime": 1525693343877.0
        },
        {
            "action":   "mousemove",
            "datetime": 1525693351075.0
        },
        {
            "action":   "mousemove",
            "datetime": 1525693351118.0
        },
        {
            "action":   "mousemove",
            "datetime": 1525693351119.0
        },
        {
            "action":   "mousemove",
            "datetime": 1525693351121.0
        },
        {
            "action":   "scrolled",
            "datetime": 1525693351212.0
        },
        {
            "action":   "scrolled",
            "datetime": 1525693354026.0
        },
        {
            "action":   "scrolled",
            "datetime": 1525693354126.0
        }
    ]
}

имя поля session1, session2 может быть любым, просто для того, чтобы показать желаемый результат.

есть идеи, как добавить это в мой существующий конвейер агрегации?

db.collection.aggregate(
    [
        { 
            "$match" : {
                "action" : {
                    "$exists" : true
                }, 
                "domain" : "domain.com"
            }
        }, 
        { 
            "$unwind" : "$action"
        }, 
        { 
            "$sort" : {
                "action.datetime" : 1.0
            }
        }, 
        { 
            "$group" : {
                "_id" : "$id", 
                "count" : {
                    "$sum" : 1.0
                }, 
                "actions" : {
                    "$addToSet" : {
                        "id" : "$id", 
                        "action" : "$action.action", 
                        "datetime" : "$action.datetime"
                    }
                }
            }
        }, 
        { 
            "$unwind" : "$actions"
        }, 
        { 
            "$sort" : {
                "actions.datetime" : 1.0
            }
        }, 
        { 
            "$group" : {
                "_id" : "$actions.id", 
                "count" : {
                    "$sum" : 1.0
                }, 
                "actions" : {
                    "$push" : {
                        "action" : "$actions.action", 
                        "datetime" : "$actions.datetime"
                    }
                }
            }
        }, 
        { 
            "$match" : {
                "count" : {
                    "$gt" : 1.0
                }
            }
        }
    ], 
    { 
        "allowDiskUse" : true
    }
);

Спасибо за внимание!

...