MongoDB में सरणी के अंदर केस-इनसेंसिटिव सबस्ट्रिंग मिलान के आधार पर सरणी तत्वों को फ़िल्टर करने के लिए, $addFields के साथ $filter, $indexOfBytes, $toUpper का उपयोग करें।
उदाहरण: सर्वर लॉग वाला दस्तावेज़
> db.demo383.insertOne({
"ServerName": "Jboss",
"ServerLogs": [
{ "status": "Working" },
{ "status": "Stop" },
{ "status": "Worked" }
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e5b635422064be7ab44e7f1") }
दस्तावेज़ देखना
> db.demo383.find().pretty();
आउटपुट: तीन लॉग एंट्री वाला एक दस्तावेज़।
एग्रीगेशन: "work" (केस-इनसेंसिटिव) वाले लॉग फ़िल्टर करें
> db.demo383.aggregate([
{ $addFields: {
ServerLogs: {
$filter: {
input: "$ServerLogs",
cond: {
$ne: [
{ $indexOfBytes: [
{ $toUpper: "$$this.status" },
{ $toUpper: "work" }
]},
-1
]
}
}
}
}}
]);
परिणाम
{ "_id" : ObjectId("5e5b635422064be7ab44e7f1"), "ServerName" : "Jboss", "ServerLogs" : [ { "status" : "Working" }, { "status" : "Worked" } ] }
चरण व्याख्या
- $toUpper: दोनों स्ट्रिंग्स को अपरकेस में बदलता है केस-इनसेंसिटिव तुलना के लिए।
- $indexOfBytes: सबस्ट्रिंग की स्थिति ढूंढता है; -1 यदि नहीं मिला।
- $ne: [..., -1]: सबस्ट्रिंग मिला तो सच लौटाता है।
- $filter: केवल उन सरणी तत्वों को रखता है जहां शर्त सत्य है।
- $addFields: मूल
ServerLogsको फ़िल्टर्ड सरणी से ओवरराइट करता है।
सरल विकल्प: $regexMatch (MongoDB 4.2+)
> db.demo383.aggregate([
{ $addFields: {
ServerLogs: {
$filter: {
input: "$ServerLogs",
cond: { $regexMatch: { input: "$$this.status", regex: "work", options: "i" } }
}
}
}}
]);
$regexMatch क्लीनर है और रेगुलर एक्सप्रेशन फीचर्स का समर्थन करता है।
नोट
- यह दस्तावेज़ को संशोधित नहीं करता; केवल आउटपुट फ़िल्टर करता है। स्थायी रूप से अपडेट करने के लिए, एग्रीगेशन परिणाम के साथ
updateOneका उपयोग करें। - बड़े सरणी के लिए,
$filterकुशल है (दस्तावेज़ के भीतर स्ट्रीमिंग)।