#mongodb #mongodb-query #aggregation-framework
#mongodb #mongodb-запрос #агрегация-фреймворк
Вопрос:
У меня есть коллекция документов, таких как:
{
"tagName": "Tag1",
"value": 1,
"ts": "2020/01/01 20:00"
},
{
"tagName": "Tag2",
"value": 2,
"ts": "2020/01/01 20:00"
},
{
"tagName": "Tag3",
"value": 3,
"ts": "2020/02/01 20:00"
}
Я бы хотел сгруппировать документы по ts
и сформулировать tagName
и value
.
таким образом, вывод намерения будет:
[
{
"Tag1": 1
"Tag2": 2,
"ts": "2020/01/01 20:00"
},
{
"Tag3": 3,
"ts": "2020/02/01 20:00"
}
]
Я попробовал следующий конвейер:
{
$group: {
'_id': '$ts',
'output': {
$push: {
'$t': '$v'
}
}
}
}
Спасибо за вашу помощь!
Ответ №1:
Когда $group
by ts
, вы должны добавить tagName
and value
в массив -> преобразовать его обратно в tagName: value
by $arrayToObject
, а затем объединить его обратно в root, чтобы получить ожидаемый результат.
db.collection.aggregate([
{
$group: {
_id: "$ts",
"tags": {
"$push": {
"k": "$tagName",
"v": "$value"
}
}
}
},
{
$project: {
"ts": "$_id",
"tagsObj": {
"$arrayToObject": "$tags"
}
}
},
{
$replaceRoot: {
newRoot: {
$mergeObjects: [
{
_id: "$_id",
},
"$tagsObj"
]
}
}
}
])