1

У меня есть Монго запросВыбор полей, как агрегирование массив мангуст/MongoDB

db.memberships.aggregate([{ 
     '$match': { 
      unit: new ObjectId('566fbaa1e63225b10bacac44') 
     } 
    }, 

    { 
     '$lookup': { 
      from: 'seasons', 
      localField: 'season', 
      foreignField: '_id', 
      as: 'season' 
     } 
    }, 

    { 
     '$unwind': '$season' 
    }, 
    { 
     '$project': { 
      season: { 
       'name': '$season.name', 
       'id': '$season._id' 
      } 
     } 
    }, 
    { 
     '$group': { 
      _id: '$_id', 
      'season': { 
       '$addToSet': '$season' 
      } 
     } 
    }, 

]); 

что приводит к

[ 
    { 
     "_id": ObjectId("56a0e5a860d8a6e41eda2ea3"), 
     "season": [{ 
      "name": "Summer", 
      "id": ObjectId("56a0d6c692c26b8c019a2758") 
     }] 
    }, 
    { 
     "_id": ObjectId("56a0e56d60d8a6e41eda2e9e"), 
     "season": [{ 
      "name": "Summer", 
      "id": ObjectId("56a0d6c692c26b8c019a2758") 
     }] 
    }, 
    { 
     "_id": ObjectId("56a0e53860d8a6e41eda2e9a"), 
     "season": [{ 
      "name": "Summer", 
      "id": ObjectId("56a0d6c692c26b8c019a2758") 
     }] 
    }, 

    { 
     "_id": ObjectId("56a0e4d660d8a6e41eda2e94"), 
     "season": [{ 
      "name": "Winter", 
      "id": ObjectId("5680dc01ba1e41f5066526fa") 
     }] 
    } 
] 

Мне нужно, чтобы получить результат в этом формате

{ 
    _id: [ 
     // ids here 
    ], 
    seasons: [{ 
      id: '56a0d6c692c26b8c019a2758', 
      'name': 'Summer' 
     }, 
     { 
      id: '5680dc01ba1e41f5066526fa', 
      'name': 'Winter' 
     } 
    ] 
} 

Запрос должен вернуть один документ с 2 свойствами id и season. Сезоны должны быть массивом уникальных сезонов. Каждый сезон должен содержать идентификатор и имя. Спасибо за помощь!

ответ

1

Restructure вы трубопровод с $group шага, чтобы иметь _id значение null для расчета суммарных значений для всех входных документов в целом, таким образом, создавая поле идентификатора как массив всех уникальных идентификаторов:

var pipeline = [ 
    { 
     '$match': { 
      unit: new ObjectId('566fbaa1e63225b10bacac44') 
     } 
    }, 

    { 
     '$lookup': { 
      from: 'seasons', localField: 'season', foreignField: '_id', as: 'season' 
     } 
    }, 
    { 
     '$unwind' : '$season' 
    }, 
    { 
     '$project': { 
      season: {'name': '$season.name', 'id' : '$season._id'} 
     } 
    }, 
     { 
     '$group': { 
      "_id": null, 
      "id": { "$addToSet": "$_id" }, 
      'season': { 
       '$addToSet': '$season' 
      } 
     } 
    }  
]; 
db.memberships.aggregate(pipeline); 
+1

Он работает, спасибо! – styopdev

Смежные вопросы