Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> MongoDB

MongoDB में "work" शब्द वाले लॉग कैसे फ़िल्टर करें?

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" } ] }

चरण व्याख्या

  1. $toUpper: दोनों स्ट्रिंग्स को अपरकेस में बदलता है केस-इनसेंसिटिव तुलना के लिए।
  2. $indexOfBytes: सबस्ट्रिंग की स्थिति ढूंढता है; -1 यदि नहीं मिला।
  3. $ne: [..., -1]: सबस्ट्रिंग मिला तो सच लौटाता है।
  4. $filter: केवल उन सरणी तत्वों को रखता है जहां शर्त सत्य है।
  5. $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 कुशल है (दस्तावेज़ के भीतर स्ट्रीमिंग)।
  1. - MongoDB में सिंपल क्वेरी का उपयोग करके दस्तावेज़ कैसे फ़िल्टर करें?

    दस्तावेज़ फ़िल्टर करने के लिए $match का उपयोग करें। $match केवल उन दस्तावेज़ों को पास करता है जो निर्दिष्ट शर्त से मेल खाते हैं, अगले पाइपलाइन स्टेज के लिए। नमूना डेटा बनाना db.demo629.insertOne( { Subject: [MySQL, MongoDB], details: [ { Name:Chris, Marks:78 }, { Name:David, Marks:89 } ] } );

  1. - MongoDB Query - Roles के आधार पर केवल Name Field Fetch करना

    इसके लिए aggregate() का उपयोग करें। यहाँ हमने 3 roles consider किए हैं - Admin, Guest, और User। Collection बनाना > db.demo532.insertOne({Name:Chris,Type:Admin}); { acknowledged : true, insertedId : ObjectId(5e8b4a9def4dcbee04fbbbf9) } > db.demo532.insertOne({Name:David,Type:Guest}); { acknowl

  1. - MongoDB क्वेरी: नेस्टेड दस्तावेज अपडेट करें

    नेस्टेड दस्तावेज को अपडेट करने के लिए, update() का उपयोग करें और उसके भीतर डॉट नोटेशन का उपयोग करें। आइए दस्तावेजों के साथ एक कलेक्शन बनाते हैं: > db.demo607.insertOne({ id:1, Info1: { Name: Chris, Age: 21, Info2: { SubjectName: MongoDB, Ma