MongoDB находит документ на основе существующей ссылки в другой коллекции

У меня есть ситуация, когда у меня есть следующий пользователь коллекции структуры базы данных:

[
    { _id: ObjectId("507f1f77bcf86c0000000001"), name: "Mike", status: "ACTIVE", verified: true },
    { _id: ObjectId("507f1f77bcf86c0000000002"), name: "Ben", status: "INACTIVE", verified: true },
    { _id: ObjectId("507f1f77bcf86c0000000003"), name: "Anastasia", status: "ACTIVE", verified: true }
]

Отчеты о коллекции

[
    { userRef: ObjectId("507f1f77bcf86c0000000001"), reportVerified: true },
    { userRef: ObjectId("507f1f77bcf86c0000000003"), reportVerified: false },
]

Как вы можете видеть, у меня есть коллекция со всеми моими пользователями, а другая коллекция под названием Report была ссылками на записи пользователя и имеет отдельное поле флага с именем reportVerified. Теперь я хочу найти все записи из коллекции пользователей, которые имеют определенные свойства в коллекции пользователей, но также являются ссылками с определенным свойством в коллекции отчетов.

Пример: я хочу найти всех пользователей, у которых User-Collection.status ACTIVE и ссылка в таблице отчетов с параметром reportVerified, установленным как true. В моем случае это должно соответствовать только Майку. Наличие свойств коллекции отчетов в коллекции пользователей напрямую для меня не вариант.

Ситуация была бы довольно простой, если бы я получил только критерии поиска либо в пользовательской коллекции (простой поиск), либо в коллекции отчетов (с использованием заполнения), но мне нужна комбинация обоих.


person Kevin H.    schedule 03.11.2020    source источник


Ответы (1)


Лучше всего было бы использовать aggregate. Сначала вам нужно использовать lookup для добавления объекта пользователя к объекту report. Например

mongoose.db(dbName).collection(cName).aggregate([
{
  $match :{} // your match condition for report
},
{
   $lookup:
         {
           from: "user-collection-name",
           let: { user_id: "$_id", user_conditon: "$status" },
           pipeline: [
              { $match:
                 { $expr:
                    { $and:
                       [
                         { $eq: [ "$userRef",  "$$user_id" ] }, // for joining collections
                         { $eq: [ conditionInput,  "$$status" ] }, // for querying on user collection
                       ]
                    }
                 }
              }
           ],
           as: "user"
         }
}
])
person MohamadrezaRahimianGolkhandani    schedule 04.11.2020