Составной запрос MongoDB $ lookup - PullRequest
1 голос
/ 21 июня 2020

Я пытаюсь заполнить свое пользовательское поле с помощью $ lookup, и вот мой результат:

 [
   {
     ...
     user: [],
     ...
   }
 ]

Как видите, результат представляет собой массив, а пользовательское поле также является пустым массивом, также я хочу сделать запрос, который сравнивает несколько полей. Допустим, у меня есть этот объект:

{
   social: {
     facebook: 'facebook.com/asd',
     twitter: 'https://twitter.com/'
   },
   skills: [ 'asd', 'asd', 'html' ],
   _id: 5eec9c9a2d6d1d46e8b05fb4,
   user: {
     _id: 5eec9c752d6d1d46e8b05fb3,
     name: 'Simeon Lazarov',
     avatar: 'uploads\\1592682240020 - background.jpg'
   },
   status: 'Junior Developer',
   experience: [
     {
       current: true,
       _id: 5eef06638af42217d8c5480a,
       title: 'ASD',
       company: 'SAD',
       location: 'ASD',
       from: 2020-06-08T00:00:00.000Z,
       to: null
     }
   ],
   education: [
     {
       current: true,
       _id: 5eef5f0dd06ee324a4a7b1d2,
       school: 'asd',
       degree: 'asd',
       fieldofstudy: 'asd',
       from: 2020-06-24T00:00:00.000Z,
       to: null
     }],
   contacts: [ { _id: 5eee23bd862ab70ba0235a85, user: 5eedffa6062e6231a859433a } ],
   date: 2020-06-19T11:08:10.883Z,
   __v: 1,
   website: 'asd',
   company: 'asd'
 }

И я хочу сравнить, если компания, навыки (все навыки этого объекта должны содержаться в других объектах) или et c. равны.

Вот мой НЕ рабочий код:

await Profile.aggregate([{$lookup: {from:"user",localField: "user",
         foreignField: "name", as: "user"}},{$match :{$or:[{"company":{$regex:profile.company}},{"skills":{ $eq: profile.skills}  }]}}]).skip((req.params.page - 1) * 10).limit(11);

PS Извините, что так плохо написал, это мой первый вопрос.

1 Ответ

1 голос
/ 21 июня 2020

Кажется, у вас просто есть несоответствия в ваших $lookup полях по сравнению с тем, что содержится в схеме, я переписал его следующим образом:

await Profile.aggregate([
    {
        $match: {
            $or: [
                {"company": {$regex: profile.company}},
                {"skills": {$all: profile.skills}}
            ]
        }
    },
    {
        $skip: req.params.page ? req.params.page - 1 : 0 // make sure this can't be -1
    },
    {
        $limit: 11
    },
    {
        $lookup: {
            from: "user",
            localField: "user",
            foreignField: "_id",
            as: "user"
        }
    },
    {
        "$unwind": "$user"
    }
])

Обратите внимание, я переместил $lookup на последний этап, поскольку это самая дорогая часть конвейера, и нет необходимости делать это для всей коллекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...