2016-09-13 1 views
6

В названии говорится все. Почему, если документ не приводит к соответствующему внешнему документу в соответствии с его полем соответствия, то почему он не включен в результирующий набор конвейера?

Я тестирую новые агрегаторы в Mongo 3.2, и я дошел до того, что выполнил поиск вложенного массива, сначала разматывая, а затем группируя документы обратно. Все, что у меня осталось, - это получить все локальные документы, которые не соответствовали критериям $lookup, что я считал стандартным определением «левого внешнего соединения».

Вот запрос:

db.users.aggregate([ 
    { 
     $unwind: "$profile", 
     $unwind: "$profile.universities" 
    }, 
    { 
     $lookup: { 
      from: "universities", 
      localField: "profile.universities._id", 
      foreignField: "_id", 
      as: "profile.universities" 
     } 
    }, 
    { 
     $group: { 
      _id: "$_id", 
      universities: { 
       $addToSet: "$profile.universities" 
      } 
     } 
    } 
]).pretty() 

Так что, если у меня есть user, который имеет пустой profile.universities массив, то мне нужно, чтобы быть включенным в наборе результатов, независимо от $lookup возвращающех никаких совпадений, но он делает не. Как я могу это сделать, и по какой-то причине Монго построил $lookup, чтобы работать таким образом?

ответ

16

Данное поведение не связано с $lookup, потому что поведение по умолчанию для $unwind заключается в том, чтобы опустить документы, в которых отсутствует ссылочное поле или пустой массив.

Чтобы сохранить разматывают документы, даже когда profile.universities является пустой массив, вы можете установить его preserveNullAndEmptyArrays вариант true:

db.users.aggregate([ 
    { 
     $unwind: "$profile", 
     $unwind: { 
      path: "$profile.universities", 
      preserveNullAndEmptyArrays: true 
     } 
    }, 
    { 
     $lookup: { 
      from: "universities", 
      localField: "profile.universities._id", 
      foreignField: "_id", 
      as: "profile.universities" 
     } 
    }, 
    { 
     $group: { 
      _id: "$_id", 
      universities: { 
       $addToSet: "$profile.universities" 
      } 
     } 
    } 
]).pretty() 
+1

Удивительно, что это именно вопрос. Огромное спасибо!! –

Смежные вопросы