MongoDB में एक ही सरणी के अंदर विभिन्न ऑब्जेक्ट्स के फील्ड्स की तुलना करने के लिए, एग्रीगेशन एक्सप्रेशन $let, $indexOfArray, $arrayElemAt, और $expr के साथ $lt, $gt आदि का उपयोग करें।
उदाहरण: विवरण सरणी वाला दस्तावेज़
> db.demo366.insertOne({
"Name" : "Chris",
"details" : [
{ "Id" : "John1", "value" : "test" },
{ "Id" : "John2", "value" : 18 },
{ "Id" : "John3", "value" : 20 }
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e57ddd92ae06a1609a00ae7") }
दस्तावेज़ देखना
> db.demo366.find();
आउटपुट: तीन तत्वों वाली सरणी के साथ एक दस्तावेज़।
क्वेरी: John2.value < John3.value वाले दस्तावेज़ ढूंढें
> db.demo366.find({
"$expr": {
"$let": {
"vars": {
"john2": { "$arrayElemAt": [ "$details", { "$indexOfArray": [ "$details.Id", "John2" ] } ] },
"john3": { "$arrayElemAt": [ "$details", { "$indexOfArray": [ "$details.Id", "John3" ] } ] }
},
"in": { "$lt": [ "$$john2.value", "$$john3.value" ] }
}
}
})
परिणाम
दस्तावेज़ लौटाया जाता है क्योंकि 18 < 20।
चरण व्याख्या
- $indexOfArray: सरणी में "John2" और "John3" Id वाले तत्व का इंडेक्स ढूंढता है।
- $arrayElemAt: उन इंडेक्स पर ऑब्जेक्ट्स निकालता है।
- $let: निकाले गए ऑब्जेक्ट्स के लिए चर (
john2,john3) बांधता है। - $lt: उनके
valueफील्ड्स की तुलना करता है। - $expr: फाइंड क्वेरी के अंदर एग्रीगेशन एक्सप्रेशन के उपयोग की अनुमति देता है।
नोट
- यह जटिल है; सरणी को रीस्ट्रक्चर करने पर विचार करें (उदाहरण के लिए, Id द्वारा ऑब्जेक्ट्स का मैप) आसान क्वेरी के लिए।
- MongoDB 5.0+ में,
$functionया$accumulatorअधिक लचीलापन दे सकते हैं। - सरणी में डुप्लिकेट Id के लिए इंडेक्स-आधारित लुकअप विफल हो सकते हैं; अद्वितीय पहचानकर्ता सुनिश्चित करें।