Как использовать findOne и агрегат одновременно в MongoDB? - PullRequest
0 голосов
/ 06 августа 2020

Допустим, у меня есть список пользователей. У пользователя есть

username,
email,
password,
sketches

sketches - другая коллекция, а sketch -

title
author

Если я хочу получить пользователя с его эскизами, я должен используйте aggregate, чтобы найти все sketches, которые имеют author как его / ее username.

Это отлично работает:

const data = await userModel
  .aggregate([
    { $match: { username } },
    { $lookup: { from: 'sketches', localField: 'username', foreignField: 'author', as: 'sketches' } },
    { $limit: 1 }
   ]).toArray()

Проблема в том, что некоторые пользователи не нет эскизов; когда у пользователя нет набросков, aggregate не возвращает ничего другого о пользователе, поэтому username, email и password становятся неопределенными.

Могу ли я сделать aggregate вроде необязательный? Например, найдите пользователя и , затем попробуйте посмотреть, есть ли у него наброски.

Спасибо!

1 Ответ

1 голос
/ 06 августа 2020

$ lookup выполняет внешнее соединение, он не удаляет поля базового документа, если нет документов для присоединения.

MongoDB Enterprise ruby-driver-rs:PRIMARY> db.foo.insert({a:1})
WriteResult({ "nInserted" : 1 })
MongoDB Enterprise ruby-driver-rs:PRIMARY> db.foo.aggregate([{$lookup:{from:'bogus',localField:'x',foreignField:'y',as:'z'}}])
{ "_id" : ObjectId("5f2c5fbd0b0bc72d0ed504d3"), "a" : 1, "z" : [ ] }

См. Также Если Mon go $ lookup является левое внешнее соединение, тогда почему оно исключает несовпадающие документы?

...