2016-09-13 4 views
6

शीर्षक यह सब कहता है। कैसे आते हैं यदि किसी दस्तावेज़ के मेल खाने वाले फ़ील्ड के अनुसार कोई मेल खाने वाला बाहरी दस्तावेज़ नहीं होता है, तो यह पाइपलाइन के परिणाम सेट में कैसे शामिल नहीं होता है?

मैं मोंगो 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 एक खाली सरणी है, तो आप true करने के लिए अपने preserveNullAndEmptyArrays विकल्प सेट कर सकते हैं:

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

कमाल है, यह वास्तव में मुद्दा था। बहुत बहुत धन्यवाद!! –

संबंधित मुद्दे

 संबंधित मुद्दे