найти все с агрегатом в mongodb с другим ключом в этом массиве объектов - PullRequest
0 голосов
/ 21 июня 2020

У меня есть такая коллекция,

  1. у компании много людей
  2. у человека много компании

документ компании такой:

{
         "_id" : ObjectId("5eeecf60a3a0d434693efe9a"),
        "name" : "ONE",
        "members" : []
}

{
         "_id" : ObjectId("5eeec400d655e7af27b07d8a"),
        "name" : "Two TWO",
        "members" : [ 
                      {"_id": ObjectId("5eeec400d65ddddd5555"), "status": false}
                    ]
}

Это то, что я пробовал использовать aggregation

db.companies.aggregate(
                    {
                     "$lookup": {
                        "from": "people", 
                        "localField": "members._id",
                        "foreignField": "_id", 
                        "as": "members"}
                     }).pretty()

После агрегирования , status отсутствует в результирующих объектах.

Вот результат агрегации.

{
         "_id" : ObjectId("5eeec400d655e7af27b07d8a"),
        "name" : "Two TWO",
        "members" : [
                      {
                        "_id": ObjectId("5eeec400d65ddddd5555"),
                        "name": "John DO"
                        "gender": "male"
                      }
                    ]
}
{
         "_id" : ObjectId("5eeecf60a3a0d434693efe9a"),
        "name" : "ONE",
        "members" : []
}

Можно ли включить ключ status как часть вывода агрегации Ожидаемый результат

members : [
      {
        company: {
                    "_id": ObjectId("5eeec400d65ddddd5555"),
                    "name": "John DO"
                    "gender": "male"
                 }
        status: false
      }
]

1 Ответ

0 голосов
/ 21 июня 2020

При поиске вы сохраняете его как matching document, в результате получается members.

Это заменяет ваш существующий объект members из вашего $$ROOT

Чтобы сохранить исходный $members от companies, а также $members от людей.

Вам потребуется merge оба объекта в фазе $project.

Вот разбивка конвейера:

Фаза 1 : $unwind на $members для извлечения массива элементов на уровне $ ROOT.

Phase2 : $lookup документ из коллекции people и сохраните его под атрибутом fromPeople.

Фаза 3 : Предполагая, что у вас есть только один соответствующий документ от People, объедините элемент объекта в массив индекс 0, с $ROOT.members, сохранить объединенный объект в атрибуте members.

db.companies.aggregate([
    {
      $unwind:{path: "$members"} 
    },
    {
        "$lookup": {
            "from": "people", 
            "localField": "members._id",
            "foreignField": "_id", 
            "as": "fromPeople"
        }
    },
    {
        $project: {
            members: { $mergeObjects: [ { $arrayElemAt: [ "$fromPeople", 0 ] }, "$$ROOT.members" ] },
        }
    }
])

Вывод

{
    "_id" : "5eeec400d655e7af27b07d8a",
    "members" : {
        "_id" : "5eeec400d65ddddd5555",
        "name" : "John DO",
        "gender" : "male",
        "status" : false
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...