2016-09-13 32 views
6

Tytuł mówi wszystko. Jak to się dzieje, jeśli dokument nie zawiera żadnego zgodnego dokumentu zewnętrznego zgodnego z pasującym polem, dlaczego więc nie jest uwzględniony w zestawie wyników potoku?

Testuję nowe agregatory w Mongo 3.2 i posunąłem się tak daleko, aby wykonać zagnieżdżone wyszukiwanie tablicy, najpierw odwijając, a następnie grupując dokumenty z powrotem. Zostało mi tylko to, że wyniki zawierają wszystkie lokalne dokumenty, które nie spełniały kryteriów $lookup, co było według mnie standardową definicją "lewe sprzężenie zewnętrzne".

Oto zapytanie:

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() 

Więc jeśli mam user że ma pusty profile.universities tablicę, potem muszę to być zawarte w zestawie wyników niezależnie od $lookup powracającego jakiekolwiek mecze, ale to robi nie. Jak mogę to zrobić i jakikolwiek powód, dla którego Mongo skonstruował $lookup, aby działał w ten sposób?

Odpowiedz

16

To zachowanie nie jest związane z $lookup, ponieważ domyślnym zachowaniem dla $unwind jest pominięcie dokumentów, w których brakuje pola z odnośnikiem lub pustej tablicy.

Aby zachować odwija ​​dokumentów nawet gdy profile.universities jest pustą tablicą, można ustawić jego opcje preserveNullAndEmptyArrays do 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

Niesamowite było to dokładnie problem. Dziękuję bardzo!! –