MongoDB $ lookup - PullRequest
       30

MongoDB $ lookup

2 голосов
/ 20 марта 2020

У меня есть коллекция объединений - и я хочу получить данные PEOPLE со своими родителями ... Как я могу это сделать -

PEOPLE

[
    {
        "_id" : ObjectId("3a9ccf7de6348936d88b3601"),
        "first_name" : "John",
        "last_name" : "Doe"
    },
    {
        "_id" : ObjectId("3a9ccf7de6348936d88b3602"),
        "first_name" : "Jane",
        "last_name" : "Doe"
    },
    {
        "_id" : ObjectId("3a9ccf7de6348936d88b3603"),
        "first_name" : "Bobby",
        "last_name" : "Doe"
    }
]

ОТНОШЕНИЯ

[
    {
        "_id" : ObjectId("5aa9a283e40f140014485116"),
        "person_id" : ObjectId("3a9ccf7de6348936d88b3603"),
        "parent_id" : ObjectId("3a9ccf7de6348936d88b3601"),
        "position": "father"
    },
    {
        "_id" : ObjectId("5aa9a283e40f140014485116"),
        "person_id" : ObjectId("3a9ccf7de6348936d88b3603"),
        "parent_id" : ObjectId("3a9ccf7de6348936d88b3602"),
        "position": "mother"
    }
]

Я хочу что-то вроде этого:

[
     {
        "_id" : ObjectId("3a9ccf7de6348936d88b3603"),
        "first_name" : "Bobby",
        "last_name" : "Doe",
        "relations: : [
            {
                "_id" : ObjectId("3a9ccf7de6348936d88b3602"),
                "first_name" : "Jane",
                "last_name" : "Doe",
                "position": "mother"
            },
            {
                "_id" : ObjectId("3a9ccf7de6348936d88b3601"),
                "first_name" : "John",
                "last_name" : "Doe",
                "position": "father"
            }
        ]
    }
]

Я знаю, что мне нужен агрегат и поиск $ но я не могу пройти большинство основ c

db.getCollection('people')
  .aggregate([
    { $lookup: {
         from: 'relations',
         localField: 'person_id',
         foreignField: '_id',
         as: 'relations'
       }
     }
    ])

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Вам нужно запустить $lookup дважды, а вторая должна иметь people в качестве значения "from":

db.people.aggregate([
    {
        $lookup: {
            from: "relations",
            localField: "_id",
            foreignField: "person_id",
            as: "relations"
        }
    },
    {
        $lookup: {
            from: "People",
            localField: "relations._id",
            foreignField: "_id",
            as: "relations"
        }
    }
])

Пн go Детская площадка

0 голосов
/ 20 марта 2020

вот еще один способ сделать это, используя вложенный поиск / под-конвейер. также показывает положение отношений.

db.people.aggregate(
[
  {
    $lookup:
        {
            from: 'relations',
            let: { person_id: '$_id' },
            pipeline: [
                {
                    $match: {
                        $expr: { $eq: ["$person_id", "$$person_id"] }
                    }
                },
                {
                    $lookup: {
                        from: "people",
                        localField: "parent_id",
                        foreignField: "_id",
                        as: "person"
                    }
                },
                {
                    $replaceWith: {
                        $mergeObjects: [{ $arrayElemAt: ["$person", 0] }, "$$ROOT"]
                    }
                },
                {
                    $project: {
                        _id: "$parent_id",
                        position: 1,
                        first_name: 1,
                        last_name: 1
                    }
                }

            ],
            as: 'relations'
        }
  }
])

https://mongoplayground.net/p/EJB-1WfanuY

...