MongoDB में $lookup का उपयोग करके ऑब्जेक्ट आईडी की सरणी वाले फील्ड पर लेफ्ट आउटर जॉइन करने के लिए, let के साथ सब-पाइपलाइन सिंटैक्स का उपयोग करें ताकि सरणी वेरिएबल बांध सके और $in के साथ $match कर सके।
उदाहरण: दो संग्रह
संग्रह 1 (demo395): उपयोगकर्ता दस्तावेज़
> db.demo395.insertOne({Name:"Chris"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e5e782317aa3ef9ab8ab207") }
> db.demo395.insertOne({Name:"David"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e5e782317aa3ef9ab8ab208") }
संग्रह 2 (demo396): ObjectId सरणी वाला दस्तावेज़
> db.demo396.insertOne({
"details" : [
ObjectId("5e5e782317aa3ef9ab8ab207"),
ObjectId("5e5e782317aa3ef9ab8ab208")
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e5e787817aa3ef9ab8ab209") }
दस्तावेज़ देखना
> db.demo395.find(); > db.demo396.find();
$lookup साथ पाइपलाइन (MongoDB 3.6+)
> db.demo396.aggregate([
{ $lookup: {
from: "demo395",
let: { details: "$details" },
pipeline: [
{ $match: { $expr: { $in: [ "$_id", "$$details" ] } } }
],
as: "output"
}}
]);
परिणाम
{
"_id" : ObjectId("5e5e787817aa3ef9ab8ab209"),
"details" : [
ObjectId("5e5e782317aa3ef9ab8ab207"),
ObjectId("5e5e782317aa3ef9ab8ab208")
],
"output" : [
{ "_id" : ObjectId("5e5e782317aa3ef9ab8ab207"), "Name" : "Chris" },
{ "_id" : ObjectId("5e5e782317aa3ef9ab8ab208"), "Name" : "David" }
]
}
चरण व्याख्या
- from: लक्ष्य संग्रह (
demo395)। - let: पाइपलाइन के लिए
detailsसरणी को$$detailsके रूप में बांधता है। - pipeline: जॉइन की गई संग्रह पर चलाने के लिए सब-पाइपलाइन।
- $match + $expr + $in:
demo395में दस्तावेज़ फ़िल्टर करता है जहां_id$$detailsसरणी में है। - as: आउटपुट फील्ड नाम (
output)।
सरल $lookup (MongoDB 3.2, सरणी के लिए नहीं)
पुराना सिंटैक्स {$lookup:{from, localField, foreignField, as}} सरणी localField के साथ काम करता है लेकिन foreignField सरणी नहीं हो सकता; यह सरणी तत्वों के विरुद्ध मिलान करता है। ऊपर दिया गया पाइपलाइन सिंटैक्स अधिक लचीला है।
प्रदर्शन
- विदेशी संग्रह पर
_idइंडेक्स सुनिश्चित करें (डिफ़ॉल्ट)। - बड़ी सरणी के लिए, पाइपलाइन में
$limitजोड़ने पर विचार करें।