अपने स्कीमा को मान्य करने, फील्ड्स में टाइपो डीबग करने, या उन फील्ड्स को ढूंढने के लिए जो सेट नहीं होने चाहिए, आपको अपने MongoDB कलेक्शन में सभी कीज़ की समझ प्राप्त करने की आवश्यकता होगी।
MongoDB-as-a-service कंपनियों में से कई, ObjectRocket सहित, UI में सीधे ऐसा करने का एक आसान तरीका प्रदान करती हैं। अनुभवी MongoDB यूजर आमतौर पर एक ऑब्जेक्ट-डॉक्यूमेंट मैपर (ODM) से शुरू करते हैं, जैसे JS के लिए Mongoose या Python के लिए Mongoengine, ताकि वे अपने एप्लिकेशन के लिए एक सुसंगत स्कीमा बना सकें और टाइपो कम कर सकें। (ODMs टाइप वैलिडेशन भी करते हैं, इसलिए आप गलती से किसी ऐसे फील्ड में स्ट्रिंग नहीं डाल रहे हैं जिसमें इंटीजर हैं और जिस पर गणित लागू होता है।)
यदि आपके पास कोई सेवा या ODM नहीं है, तो कीज़ तक पहुंचने के लिए कई अन्य तरीके हैं जिनका आप उपयोग कर सकते हैं। यहां विभिन्न परिस्थितियों के लिए MongoDB कलेक्शन में सभी कीज़ प्राप्त करने के सर्वोत्तम तरीके दिए गए हैं।
एक उदाहरण
db.activities.insert( { type : ['indoor', 'outdoor' , 'mixed'] } );
db.activities.insert( { activity : 'cycling' } );
db.activities.insert( { activity : 'skiing', location: 'Alpes', } );
db.activities.insert( { equipment : ['paddles','sunglasses'] } );
आप यूनिक कीज़ प्राप्त करना चाहेंगे:
type, activity, equipment, location
MapReduce
आप इसे MapReduce के साथ कर सकते हैं:
mr = db.runCommand({ "mapreduce" : "activities", "map" : function() { for (var key in this) { emit(key, null); } }, "reduce" : function(key, stuff) { return null; }, "out": "activities" + "_keys" })
एक बार यह पूरा हो जाने पर, परिणामी कलेक्शन पर distinct कमांड चलाएं ताकि सभी कीज़ मिल सकें:
db.activities_keys.distinct("_id")
यदि आप सबडॉक्यूमेंट में सभी यूनिक कीज़ की सूची प्राप्त करना चाहते हैं, तो बस इस लाइन को संशोधित करें:
for (var key in this.first_level.second_level.nth_level) { emit(key, null); }
Aggregation
आप aggregation का भी उपयोग कर सकते हैं। यह विधि उन सभी ड्राइवर्स के साथ काम करती है जो aggregate फ्रेमवर्क का समर्थन करते हैं। अपने aggregation के साथ, ओवरहेड कम करने के लिए $sample या $limit का उपयोग किया जा सकता है।
नोट: प्राइमरी रीड प्रेफरेंस के साथ चलाने से परफॉरमेंस प्रभावित हो सकती है। सेकेंडरी रीड प्रेफरेंस के साथ चलाने पर विचार करें।
$objectToArrray (वर्जन 3.4.4 और ऊपर में उपलब्ध) के साथ aggregation का उपयोग करके सभी टॉप की और वैल्यू पेयर को डॉक्यूमेंट एरे में बदलें, इसके बाद $unwind और $addToSet के साथ $group का उपयोग करके पूरे कलेक्शन में विशिष्ट कीज़ प्राप्त करें।
$$ROOT टॉप लेवल डॉक्यूमेंट को संदर्भित करने के लिए।
db.activities.aggregate([ {"$project":{"arrayofkeyvalue":{"$objectToArray":"$$ROOT"}}}, {"$unwind":"$arrayofkeyvalue"}, {"$group":{"_id":null,"allkeys":{"$addToSet":"$arrayofkeyvalue.k"}}} ])
एकल डॉक्यूमेंट में कीज़ प्राप्त करें
आप एकल डॉक्यूमेंट में कीज़ प्राप्त करने के लिए aggregation का भी उपयोग कर सकते हैं:
db.activities.aggregate([ {"$project":{"arrayofkeyvalue":{"$objectToArray":"$$ROOT"}}}, {"$project":{"keys":"$arrayofkeyvalue.k"}} ])
Mongo Shell
आप mongo shell क्लाइंट के तहत इसे भी आज़मा सकते हैं:
var allKeys = {}; db.YOURCOLLECTION.find().forEach(function(doc){Object.keys(doc).forEach(function(key){allKeys[key]=1})}); allKeys;
एकल डॉक्यूमेंट के लिए आउटपुट फील्ड्स
यदि आपको कलेक्शन में एकल डॉक्यूमेंट के लिए फील्ड्स के आउटपुट की आवश्यकता है (चूंकि अन्य सभी में पूरी तरह से अलग कीज़ हो सकती हैं) तो निम्नलिखित का उपयोग करें:
doc=db.thinks.findOne(); for (key in doc) print(key);
Python
या, आप Python का उपयोग कर सकते हैं। यह कलेक्शन में सभी टॉप-लेवल कीज़ का सेट लौटाता है:
#Using pymongo and connection named 'db' reduce( lambda all_keys, rec_keys: all_keys | set(rec_keys), map(lambda d: d.keys(), db.things.find()), set() )
JavaScript
या, आप JavaScript का उपयोग कर सकते हैं:
db.collection('collectionName').mapReduce( function() { for (var key in this) { emit(key, null); } }, function(key, stuff) { return null; }, { "out": "allFieldNames" }, function(err, results) { var fields = db.collection('allFieldNames').distinct('_id'); fields .then(function(data) { var finalData = { "status": "success", "fields": data }; res.send(finalData); delteCollection(db, 'allFieldNames'); }) .catch(function(err) { res.send(err); delteCollection(db, 'allFieldNames'); }); });
नव निर्मित कलेक्शन "allFieldNames" को पढ़ने के बाद, इसे हटा दें।
db.collection("allFieldNames").remove({}, function (err,result) { db.close(); return; });
इतने सारे विकल्प…
आपके पास ये Mongo कीज़ प्राप्त करने के बहुत सारे विकल्प हैं! यदि आप MongoDB मैनेजमेंट से अभिभूत हैं और डेटाबेस मैनेजमेंट के बजाय अपने कोड पर ध्यान केंद्रित करना चाहते हैं, तो हम यहां आपके लिए हैं। हमारे डेटाबेस प्लेटफॉर्म और व्हाइट ग्लव सपोर्ट को मुफ्त में आज़माएं।