2016-06-22 4 views
2

У меня есть этот вид документов в коллекции MongoDB:Граф вхождение двух полей

[ 
    { 
    "_id": { 
     "id": 892, 
     "answer": "C", 
     "level": "regular" 
    }, 
    "total": 4 
    }, 
    { 
    "_id": { 
     "id": 891, 
     "answer": "Regular", 
     "level": "neutral" 
    }, 
    "total": 3 
    }, 
    { 
    "_id": { 
     "id": 892, 
     "answer": "B", 
     "level": "regular" 
    }, 
    "total": 3 
    }, 
    { 
    "_id": { 
     "id": 891, 
     "answer": "Ótimo", 
     "level": "positive" 
    }, 
    "total": 5 
    }, 
    { 
    "_id": { 
     "id": 892, 
     "answer": "E", 
     "level": "regular" 
    }, 
    "total": 3 
    }, 
    { 
    "_id": { 
     "id": 891, 
     "answer": "Bom", 
     "level": "positive" 
    }, 
    "total": 1 
    }, 
    { 
    "_id": { 
     "id": 891, 
     "answer": "Ruim", 
     "level": "negative" 
    }, 
    "total": 2 
    }, 
    { 
    "_id": { 
     "id": 892, 
     "answer": "D", 
     "level": "regular" 
    }, 
    "total": 3 
    }, 
    { 
    "_id": { 
     "id": 891, 
     "answer": "Péssimo", 
     "level": "negative" 
    }, 
    "total": 3 
    }, 
    { 
    "_id": { 
     "id": 892, 
     "answer": "F", 
     "level": "regular" 
    }, 
    "total": 1 
    } 
] 

Я пытаюсь сосчитать answer и level вхождений с использованием MongoDB агрегации pipiline. Я ожидаю некоторые результаты следующим образом:

[ 
    { 
    "id": 891, 
    "answers": [ 
     { 
     "answer": "Ótimo", 
     "count": 5 
     }, 
     { 
     "answer": "Bom", 
     "count": 1 
     }, 
     { 
     "answer": "Regular", 
     "count": 3 
     }, 
     { 
     "answer": "Ruim", 
     "count": 2 
     }, 
     { 
     "answer": "Péssimo", 
     "count": 3 
     } 
    ], 
    "levels": [ 
     { 
     "level": "positive", 
     "count": 6 
     }, 
     { 
     "level": "neutral", 
     "count": 3 
     }, 
     { 
     "level": "negative", 
     "count": 5 
     } 
    ], 
    "total": 14 
    }, 
    { 
    "id": 892, 
    "answers": [ 
     { 
     "answer": "B", 
     "count": 3 
     }, 
     { 
     "answer": "C", 
     "count": 4 
     }, 
     { 
     "answer": "D", 
     "count": 3 
     }, 
     { 
     "answer": "E", 
     "count": 3 
     }, 
     { 
     "answer": "F", 
     "count": 1 
     }, 
    ], 
    "levels": [ 
     { 
     "level": "regular", 
     "count": 14 
     } 
    ], 
    "total": 14 
    } 
] 

Как достичь желаемого результата с использованием конвейера агрегации MongoDb?

EDIT: На самом деле, я уже использую $ group для достижения чего-то подобного, но я думаю, что только один шаг в группе $ group на конвейере не достигнет желаемого результата. Вот мой текущий шаг $ Группа:

{ 
    $group: { 
    _id: { 
     id: "$_id.id" 
    }, 
    answers: { 
     $push: { 
     answer: "$_id.answer", 
     count: "$count" 
     } 
    }, 
    levels: { 
     $push: { 
     level: "$_id.level", 
     count: "$count" 
     } 
    }, 
    total: { $sum: "$count" } 
    } 
} 

Вот выход у меня до сих пор:

[ 
    { 
    "_id": { 
     "id": 892 
    }, 
    "answers": [ 
     { 
     "answer": "F", 
     "count": 1 
     }, 
     { 
     "answer": "D", 
     "count": 3 
     }, 
     { 
     "answer": "E", 
     "count": 3 
     }, 
     { 
     "answer": "C", 
     "count": 4 
     }, 
     { 
     "answer": "B", 
     "count": 3 
     } 
    ], 
    "levels": [ 
     { 
     "level": "regular" 
     }, 
     { 
     "level": "regular" 
     }, 
     { 
     "level": "regular" 
     }, 
     { 
     "level": "regular" 
     }, 
     { 
     "level": "regular" 
     } 
    ] 
    }, 
    { 
    "_id": { 
     "id": 891 
    }, 
    "answers": [ 
     { 
     "answer": "Ruim", 
     "count": 2 
     }, 
     { 
     "answer": "Péssimo", 
     "count": 3 
     }, 
     { 
     "answer": "Bom", 
     "count": 1 
     }, 
     { 
     "answer": "Regular", 
     "count": 3 
     }, 
     { 
     "answer": "Ótimo", 
     "count": 5 
     } 
    ], 
    "levels": [ 
     { 
     "level": "negative" 
     }, 
     { 
     "level": "negative" 
     }, 
     { 
     "level": "positive" 
     }, 
     { 
     "level": "neutral" 
     }, 
     { 
     "level": "positive" 
     } 
    ] 
    } 
] 

ответ

0

Следующая агрегация трубопровода:

{ $group: { 
    _id: { id: "$_id.id" }, 
    answers: { 
    $push: { 
     answer: "$_id.answer", 
     level: "$_id.level", 
     count: "$total" 
    } 
    }, 
    levels: { 
    $push: { 
     level: "$_id.level", 
     count: "$total" 
    } 
    } 
}}, 
{ $unwind: $levels }, 
{ $group: { 
    _id: { 
    id: "$_id.id", 
    level: "$levels.level" 
    }, 
    answers: { $addToSet: "$answers" }, 
    total: { $sum: "$levels.count" } 
}}, 
{ $group: { 
    _id: { id: "$_id.id" }, 
    answers: { $addToSet: "$answers" }, 
    levels: { 
    $push: { 
     level: "$_id.level", 
     count: "$total" 
    } 
    }, 
    total: { $sum: "$total" } 
}}, 
{ $project: { 
    _id: 0, 
    id: "$_id.id", 
    answers: 1, 
    levels: 1, 
    total: 1 
}} 

будет производить желаемый результат.