2016-03-05 14 views
23

के साथ एकाधिक संग्रह में शामिल होने के लिए मैं कुल $ लुकअप का उपयोग करके दो से अधिक संग्रहों में शामिल होना चाहता हूं। क्या इसमें शामिल होना संभव है? अगर यह संभव है तो कृपया मुझे बताएं। मुझे कुछ उदाहरण दो। यहाँ मैं तीन संग्रह:

"उन"

{  
"_id" : ObjectId("5684f3c454b1fd6926c324fd"), 
    "email" : "[email protected]", 
    "userId" : "AD", 
    "userName" : "admin" 
} 

"UserInfo"

{ 
    "_id" : ObjectId("56d82612b63f1c31cf906003"), 
    "userId" : "AD", 
    "phone" : "0000000000" 
} 

"userrole"

{ 
    "_id" : ObjectId("56d82612b63f1c31cf906003"), 
    "userId" : "AD", 
    "role" : "admin" 
} 
+0

संभावित डुप्लिकेट (https://stackoverflow.com/questions/37086387/multiple-join-conditions-using-the-lookup-operator) – styvane

+0

संभव डुप्लिकेट [मैं MongoDB में संदर्भित वस्तुओं को कैसे पूछूं?] (https: // stackoverflow।कॉम/प्रश्न/9 621 9 28/कैसे करें-मैं-क्वेरी-संदर्भित-ऑब्जेक्ट-इन-मोंगोडब) – sidgate

उत्तर

9

documentation के अनुसार, $ देखने केवल शामिल हो सकते हैं एक बाहरी संग्रह।

आप एक संग्रह में userInfo और userRole को गठबंधन करना चाहते हैं, जैसा कि प्रदान किया गया उदाहरण डीबी स्कीमा के संबंध में आधारित है। मोंगो नोएसक्यूएल डेटाबेस है - और इसके लिए दस्तावेज़ प्रबंधन के लिए अलग-अलग दृष्टिकोण की आवश्यकता है।

कृपया 2-चरणीय क्वेरी नीचे पाएं, जो userInfo के साथ userInfo को जोड़ती है - संयुक्त डेटा प्रदर्शित करने के लिए अंतिम क्वेरी में उपयोग किए गए नए अस्थायी संग्रह को बनाते हैं। पिछली क्वेरी में $ आउट का उपयोग करने और बाद में उपयोग के लिए मर्ज किए गए डेटा के साथ नया संग्रह बनाने का विकल्प है।

संग्रह

db.sivaUser.insert(
{  
    "_id" : ObjectId("5684f3c454b1fd6926c324fd"), 
     "email" : "[email protected]", 
     "userId" : "AD", 
     "userName" : "admin" 
}) 

//"userinfo" 
db.sivaUserInfo.insert(
{ 
    "_id" : ObjectId("56d82612b63f1c31cf906003"), 
    "userId" : "AD", 
    "phone" : "0000000000" 
}) 

//"userrole" 
db.sivaUserRole.insert(
{ 
    "_id" : ObjectId("56d82612b63f1c31cf906003"), 
    "userId" : "AD", 
    "role" : "admin" 
}) 

बनाने "में शामिल होने" उन सब :-)

db.sivaUserInfo.aggregate([ 
    {$lookup: 
     { 
      from: "sivaUserRole", 
      localField: "userId", 
      foreignField: "userId", 
      as: "userRole" 
     } 
    }, 
    { 
     $unwind:"$userRole" 
    }, 
    { 
     $project:{ 
      "_id":1, 
      "userId" : 1, 
      "phone" : 1, 
      "role" :"$userRole.role" 
     } 
    }, 
    { 
     $out:"sivaUserTmp" 
    } 
]) 


db.sivaUserTmp.aggregate([ 
    {$lookup: 
     { 
      from: "sivaUser", 
      localField: "userId", 
      foreignField: "userId", 
      as: "user" 
     } 
    }, 
    { 
     $unwind:"$user" 
    }, 
    { 
     $project:{ 
      "_id":1, 
      "userId" : 1, 
      "phone" : 1, 
      "role" :1, 
      "email" : "$user.email", 
      "userName" : "$user.userName" 
     } 
    } 
]) 
+0

हम्म ........... –

+0

दिलचस्प ... प्रदर्शन परीक्षण? –

22

आप वास्तव में एक से अधिक $ देखने चरणों श्रृंखला कर सकते हैं। संग्रह profesor79 द्वारा साझा के नाम के आधार पर, आप यह कर सकते हैं:

db.sivaUserInfo.aggregate([ 
    { 
     $lookup: { 
      from: "sivaUserRole", 
      localField: "userId", 
      foreignField: "userId", 
      as: "userRole" 
     } 
    }, 
    { 
     $unwind: "$userRole" 
    }, 
    { 
     $lookup: { 
      from: "sivaUserInfo", 
      localField: "userId", 
      foreignField: "userId", 
      as: "userInfo" 
     } 
    }, 
    { 
     $unwind: "$userInfo" 
    } 
]) 

यह निम्नलिखित संरचना वापस आ जाएगी:

{ 
    "_id" : ObjectId("56d82612b63f1c31cf906003"), 
    "userId" : "AD", 
    "phone" : "0000000000", 
    "userRole" : { 
     "_id" : ObjectId("56d82612b63f1c31cf906003"), 
     "userId" : "AD", 
     "role" : "admin" 
    }, 
    "userInfo" : { 
     "_id" : ObjectId("56d82612b63f1c31cf906003"), 
     "userId" : "AD", 
     "phone" : "0000000000" 
    } 
} 

हो सकता है कि यह एक विरोधी पैटर्न माना जा सकता है क्योंकि MongoDB 'नहीं था टी संबंधपरक होने का मतलब है लेकिन यह उपयोगी है।

+2

यह वास्तव में काम करता है। धन्यवाद! –

+0

क्या होगा यदि हम उपयोगकर्ता भूमिका में उपयोगकर्ता के रूप में उपयोगकर्ता की जानकारी दिखाना चाहते हैं? यह –

16

मोंगोड 3.2 और बाद के संस्करणों द्वारा समर्थित जुड़ने की सुविधा। आप कुल क्वेरी का उपयोग करके जॉइन का उपयोग कर सकते हैं।
आप उदाहरण नीचे का उपयोग कर ऐसा कर सकते हैं:

db.users.aggregate([ 

    // Join with user_info table 
    { 
     $lookup:{ 
      from: "userinfo",  // other table name 
      localField: "userId", // name of users table field 
      foreignField: "userId", // name of userinfo table field 
      as: "user_info"   // alias for userinfo table 
     } 
    }, 
    { $unwind:"$user_info" },  // $unwind used for getting data in object or for one record only 

    // Join with user_role table 
    { 
     $lookup:{ 
      from: "userrole", 
      localField: "userId", 
      foreignField: "userId", 
      as: "user_role" 
     } 
    }, 
    { $unwind:"$user_role" }, 

    // define some conditions here 
    { 
     $match:{ 
      $and:[{"userName" : "admin"}] 
     } 
    }, 

    // define which fields are you want to fetch 
    { 
     $project:{ 
      _id : 1, 
      email : 1, 
      userName : 1, 
      userPhone : "$user_info.phone", 
      role : "$user_role.role", 
     } 
    } 
]); 

यह इस तरह परिणाम दे देंगे:

{ 
    "_id" : ObjectId("5684f3c454b1fd6926c324fd"), 
    "email" : "[email protected]", 
    "userName" : "admin", 
    "userPhone" : "0000000000", 
    "role" : "admin" 
} 

आशा इस आप या आपकी मदद करेंगे किसी और।

धन्यवाद

की [एकाधिक $ देखने ऑपरेटर का उपयोग की स्थिति में शामिल होने के]
+0

कैसे करें यदि आप उस तालिका से ** $ unwind ** को निकालने के बजाय अन्य तालिका से सरणी में डेटा चाहते हैं, तो डेटा को लाने के लिए क्वेरी से "** {$ unwind:" $ user_role "} **" निकालें ** user_role ** तालिका से सरणी –