MongoDB में सरणी के अंदर सबडॉक्यूमेंट पर शर्त के आधार पर दस्तावेज़ फ़िल्टर करने के लिए, $expr के साथ $let, $arrayElemAt (या $filter/$elemMatch) का उपयोग करें।
उदाहरण: दिनांक सीमा वाले सबडॉक्यूमेंट्स की सरणी
> db.demo394.insertOne({
details: [
{ _id: '1', startDate: '2018-01-11T07:00:00.000Z', endDate: '2019-01-12T07:59:59.999Z' },
{ _id: '2', startDate: '2019-01-21T07:00:00.000Z', endDate: '2020-01-04T07:59:59.999Z' }
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e5e716817aa3ef9ab8ab202") }
दस्तावेज़ देखना
> db.demo394.find();
आउटपुट: दो सबडॉक्यूमेंट्स वाला एक दस्तावेज़।
क्वेरी: अंतिम सबडॉक्यूमेंट का endDate विशिष्ट मान से मेल खाता है
> db.demo394.find({
$expr: {
$let: {
vars: { "d": { $arrayElemAt: [ "$details", -1 ] } },
in: { $eq: [ "$$d.endDate", "2020-01-04T07:59:59.999Z" ] }
}
}
});
परिणाम
दस्तावेज़ लौटाया जाता है क्योंकि अंतिम तत्व का endDate मेल खाता है।
व्याख्या
- $arrayElemAt: ["$details", -1] सरणी का अंतिम तत्व लौटाता है (-1 = अंतिम)।
- $let: उस तत्व को चर
dमें बांधता है। - $eq:
$$d.endDateकी तुलना लक्ष्य स्ट्रिंग से करता है। - $expr: फाइंड क्वेरी के अंदर एग्रीगेशन एक्सप्रेशन के उपयोग की अनुमति देता है।
वैकल्पिक: $elemMatch (सरल फील्ड मिलान के लिए)
> db.demo394.find({ details: { $elemMatch: { endDate: "2020-01-04T07:59:59.999Z" } } });
यह जांचता है कि क्या कोई भी सबडॉक्यूमेंट शर्त से मेल खाता है (सिर्फ अंतिम नहीं)।
वैकल्पिक: एग्रीगेशन $filter (सबडॉक्यूमेंट लौटाने के लिए)
> db.demo394.aggregate([
{ $project: {
matchingDetails: {
$filter: {
input: "$details",
cond: { $eq: [ "$$this.endDate", "2020-01-04T07:59:59.999Z" ] }
}
}
}}
]);
नोट
- दिनांक स्ट्रिंग के रूप में संग्रहीत हैं; उचित दिनांक तुलना के लिए, ISODate ऑब्जेक्ट संग्रहीत करें और
$dateFromStringया सीधे तुलना का उपयोग करें। $arrayElemAtके लिए MongoDB 3.2+ आवश्यक।