MongoDB एग्रीगेशन में $filter के साथ दो फील्ड्स की तुलना
इसके लिए aggregate() के साथ $filter का उपयोग करें।
कलेक्शन बनाना
> db.demo137.insertOne(
{
Name1: "Chris",
Name2: "David",
Detail1: [
{ _id: "John", Name3: "Chris" },
{ _id: "Chris", Name3: "Chris" }
],
Detail2: [
{ _id: "David", Name3: "Chris" },
{ _id": "Carol", Name3: "Chris" },
{ _id": "John", Name3: "Chris" }
]
}
);
{ "acknowledged": true, "insertedId": ObjectId("5e31b4cefdf09dd6d08539a0") }
सभी डॉक्यूमेंट्स
> db.demo137.find();
{ "_id": ObjectId("5e31b4cefdf09dd6d08539a0"), "Name1": "Chris", "Name2": "David", "Detail1": [ { "_id": "John", "Name3": "Chris" }, { "_id": "Chris", "Name3": "Chris" } ], "Detail2": [ { "_id": "David", "Name3": "Chris" }, { "_id": "Carol", "Name3": "Chris" }, { "_id": "John", "Name3": "Chris" } ] }
एग्रीगेशन फिल्टर क्वेरी
> db.demo137.aggregate([
{
$project: {
_id: 0,
Name1: 1,
Name2: 1,
Detail1: {
$filter: {
input: "$Detail1",
as: "out",
cond: { $eq: ["$$out._id", "$Name1"] }
}
},
Detail2: {
$filter: {
input: "$Detail2",
as: "out",
cond: { $eq: ["$$out._id", "$Name2"] }
}
}
}
}
])
परिणाम
{ "Name1": "Chris", "Name2": "David", "Detail1": [ { "_id": "Chris", "Name3": "Chris" } ], "Detail2": [ { "_id": "David", "Name3": "Chris" } ] }
व्याख्या
- $project: आउटपुट आकार परिभाषित करता है
- $filter: ऐरे से तत्वों को फ़िल्टर करता है
- input: फ़िल्टर करने वाला ऐरे
- as: प्रत्येक तत्व के लिए वेरिएबल नाम (यहां "out")
- cond: शर्त - $$out._id (वर्तमान तत्व का _id) की तुलना टॉप-लेवल फील्ड ($Name1 या $Name2) से करता है
- Detail1: केवल वही तत्व रखता है जहां _id == Name1 ("Chris")
- Detail2: केवल वही तत्व रखता है जहां _id == Name2 ("David")
महत्वपूर्ण
$filter में बाहरी फील्ड्स तक पहुँचने के लिए $ (डॉलर) प्रीफिक्स का उपयोग करें ($Name1), और वेरिएबल के लिए $$ (डबल डॉलर) का उपयोग करें ($$out._id)।