как сделать агрегацию в nodejs - PullRequest
1 голос
/ 27 мая 2020

Мне нужно получить запись, в которой есть поле имени, которое я указываю, и поле subjectId другой коллекции, для которой у меня есть subjectname - например, я хотел бы получить запись студента, в которой есть name lora и subjectname как физика (но проблема в том, что у меня есть subjectname, но у студента коллекции есть идентификатор поля этого объекта, который уже был сохранен в какой-то другой коллекции, например, субъектов - с _id - -subject _id действует как внешнее поле в записи студента, у меня есть имя студента и имя предмета, как я могу получить доступ к студенту с соответствующими полями?

1 Ответ

0 голосов
/ 27 мая 2020

У вас есть два варианта, как это сделать в понедельник go, причем вариант номер 1 - это тот, который я лично рекомендую, так как он будет более эффективным.

  1. Разделите это на два запроса :
let subject = await subjectCollection.findOne({name: subjectname});
// add validation that subject exists in case needed.
let doc = await firstCollection.findOne({name: name, subjectId: subject._id})
// you can use `find` instead if multiple documents can be matched.
Используйте $ поиск
firstCollection.aggregate([
    {
        $match: {
            name: name
        }
    },
    {
        $lookup: {
            from: "subject_collection",
            let: {subjectName: subjectName},
            pipeline: [
                {
                    $match: {
                        $expr: {
                            $eq: ["$$subjectName", "$name"]
                        }
                    }
                }  
            ],
            as: "subjects"
        }
    },
    {
        $match: {
            "subjects.0": {$exists: true}
        }
    }
])
...