वास्तव में ऐसा करने का "सर्वश्रेष्ठ" तरीका .aggregate() का उपयोग करना है।
और $lookup
डेटा को "जुड़ने" के लिए और मैच की स्थितियों पर "फ़िल्टर" करने के लिए। यह बहुत प्रभावी है क्योंकि MongoDB वास्तव में यह सब "सर्वर" पर ही करता है, "एकाधिक" प्रश्नों को जारी करने की तुलना में .populate()
करता है।
MovieModel.aggregate([
{ "$match": { "m_title": m_title } },
{ "$lookup": {
"from": RankMovieModel.collection.name,
"localField": "_id",
"foreignField": "movie",
"as": "rankings"
}}
])
अगर रैंकिंग के "बहुत सारे" हैं, तो आप <का उपयोग करने के लिए सर्वश्रेष्ठ हैं कोड>$अनविंड , जो प्रत्येक संबंधित "रैंकिंग" आइटम के लिए एक दस्तावेज़ तैयार करेगा:
MovieModel.aggregate([
{ "$match": { "m_title": m_title } },
{ "$lookup": {
"from": RankMovieModel.collection.name,
"localField": "_id",
"foreignField": "movie",
"as": "rankings"
}},
{ "$unwind": "$rankings" }
])
यहां एक विशेष हैंडलिंग भी है कि कैसे MongoDB 16MB BSON सीमा को भंग करने से बचने के लिए "जुड़ने" दस्तावेजों से निपटता है। तो वास्तव में यह विशेष बात तब होती है जब $unwind
सीधे एक $lookup
का अनुसरण करता है
पाइपलाइन चरण:
{
"$lookup" : {
"from" : "rankmovies",
"as" : "rankings",
"localField" : "_id",
"foreignField" : "movie",
"unwinding" : {
"preserveNullAndEmptyArrays" : false
}
}
}
तो $unwind
वास्तव में "गायब" होता है और इसके बजाय $लुकअप
अपने आप में जैसे कि यह "एक" ऑपरेशन था। इस तरह हम सीधे मूल दस्तावेज़ के भीतर एक "सरणी" नहीं बनाते हैं जिसके कारण कई "संबंधित" वस्तुओं के साथ चरम मामलों में आकार 16MB से अधिक हो जाएगा।
अगर आपके पास एक MongoDB नहीं है जो $lookup
( मोंगोडीबी 3.2 मिनुनम ) तो आप .populate()
के साथ "वर्चुअल" का उपयोग कर सकते हैं
इसके बजाय (न्यूनतम 4.5.0 नेवला की आवश्यकता है ) लेकिन ध्यान दें कि यह वास्तव में "दो" करता है सर्वर से पूछताछ:
पहले "वर्चुअल" को स्कीमा में जोड़ें:
movieSchema.virtual("rankings",{
"ref": "Movie",
"localField": "_id",
"foreignField": "movie"
});
फिर .populate()
के साथ क्वेरी जारी करें
:
MovieModel.find({ "m_title": m_title })
.populate('rankings')
.exec()