Данные исключаются при использовании $unwind в представлении MongoDB

В моем бэкэнде MongoDB я определил вид Mongo, который возвращает список сотрудников. Проблема, с которой я сталкиваюсь, состоит в том, если я использую $lookup с последующим $unwind на одном из моих этапов агрегирования, и у этого конкретного человека еще нет данных для этого свойства, тогда они будут исключены из возвращенных данных. Я говорю об агрегации так:

{
    $lookup: { "from" : "departments", "localField" : "department", "foreignField" : "_id", "as" : "department" }
},

{
  $unwind: { "path" : "$department" }
}, 

Есть ли способ обойти это: где я могу использовать $lookup а также $unwind здесь, а также НЕ исключая этого человека, если у него нет данных для этого поля? И будет ли это сделано здесь или в $project Этап я называю пару этапов позже (см. код ниже)?

{
    $project: { "name" : 1.0, "department" : { "name" : "$department.name" }, "branch" : { "name" : "$branch.name" }, "addresses" : 1.0, "notes" : 1.0, "phones" : 1.0, "emails" : 1.0, "updatedAt" : 1.0 }
},

2 ответа

Решение

Вы можете использовать preserveNullAndEmptyArrays из $unwind для достижения этой цели:

{
  $lookup: { 
     "from" : "departments", 
     "localField" : "department", 
     "foreignField" : "_id", 
     "as" : "department" }
 },
 {
   $unwind: { 
     "path" : "$department",
     "preserveNullAndEmptyArrays": true
  }
}, 

Согласно документации MongoDB

  If you specify a path for a field that does not exist in an input document or the field 
is an empty array, $unwind, by default, ignores the input document
 and will not output documents for that input document.

   New in version 3.2: To output documents where the array field is missing, 
null or an empty array, use the option preserveNullAndEmptyArrays.

Вы можете попробовать выполнить следующий совокупный запрос

db.collection.aggregate([
    {
      $lookup: { 
         "from" : "departments", 
         "localField" : "department", 
         "foreignField" : "_id", 
         "as" : "department" }
     },
     {
       $unwind: { 
         "path" : "$department",
         "preserveNullAndEmptyArrays": true
      }
    }])
Другие вопросы по тегам