परिचय
मूल रूप से 18 जनवरी, 2019 को ObjectRocket.com/blog पर प्रकाशित।
अपने स्कीमा को मान्य करने के लिए, फील्ड में टाइपो डीबग करने के लिए, या उन फील्ड को ढूंढने के लिए जिन्हें आप सेट नहीं करना चाहिए, आपको अपने MongoDB® संग्रह में सभी कुंजियों की समझ की आवश्यकता है।
ObjectRocket सहित कई MongoDB-as-a-Service कंपनियां, उपयोगकर्ता इंटरफेस (UI) में इसे करने का एक आसान तरीका प्रदान करती हैं। अनुभवी MongoDB उपयोगकर्ता आमतौर पर ऑब्जेक्ट-डॉक्यूमेंट मैपर (ODM) से शुरू करते हैं, जैसे JavaScript® के लिए Mongoose या Python® के लिए Mongoengine, ताकि वे अपने एप्लिकेशन के लिए एक सुसंगत स्कीमा बना सकें और टाइपो कम कर सकें। ODM टाइप वैलिडेशन भी करते हैं, इसलिए आप गलती से एक स्ट्रिंग को उस फील्ड में नहीं डालते जिसमें इंटीजर हैं और जिस पर गणित लागू होता है।
यदि आपके पास कोई सेवा या ODM नहीं है, तो आप कुंजियों तक पहुंचने के लिए कई अन्य विधियों का उपयोग कर सकते हैं। हमने विभिन्न परिस्थितियों के लिए MongoDB संग्रह में सभी कुंजियों को प्राप्त करने के लिए निम्नलिखित विधियों को पाया है।
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);
}
एग्रीगेशन
आप एग्रीगेशन का भी उपयोग कर सकते हैं। यह विधि उन सभी ड्राइवर्स के साथ काम करती है जो एग्रीगेट फ्रेमवर्क का समर्थन करते हैं। अपने एग्रीगेशन के साथ, ओवरहेड कम करने के लिए $sample या $limit का उपयोग करें।
नोट: प्राथमिक रीड प्राथमिकता के साथ चलने से प्रदर्शन प्रभावित हो सकता है। सेकेंडरी रीड प्राथमिकता के साथ चलने पर विचार करें।
$objectToArrray (संस्करण 3.4.4 और ऊपर में उपलब्ध) के साथ एग्रीगेशन का उपयोग करके सभी शीर्ष कुंजी और मान जोड़े को डॉक्यूमेंट ऐरे में परिवर्तित करें, इसके बाद $unwind और $addToSet के साथ $group का उपयोग करके संपूर्ण संग्रह में विशिष्ट कुंजियाँ प्राप्त करें।
निम्न उदाहरण में, $$ROOT शीर्ष स्तर के डॉक्यूमेंट को संदर्भित करता है।
db.activities.aggregate([
{"$project":{"arrayofkeyvalue":{"$objectToArray":"$$ROOT"}}},
{"$unwind":"$arrayofkeyvalue"},
{"$group":{"_id":null,"allkeys":{"$addToSet":"$arrayofkeyvalue.k"}}}
])
आप किसी एकल डॉक्यूमेंट में कुंजियाँ प्राप्त करने के लिए एग्रीगेशन का भी उपयोग कर सकते हैं, निम्न कमांड का उपयोग करके:
db.activities.aggregate([
{"$project":{"arrayofkeyvalue":{"$objectToArray":"$$ROOT"}}},
{"$project":{"keys":"$arrayofkeyvalue.k"}}
])
Mongo शेल
आप Mongo शेल क्लाइंट के तहत निम्न कमांड का उपयोग करके कुंजियाँ भी प्राप्त कर सकते हैं:
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
आप MongoDB कुंजियाँ प्राप्त करने के लिए 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 प्रबंधन से अभिभूत हैं और डेटाबेस प्रबंधन के बजाय अपने कोड पर ध्यान केंद्रित करना चाहते हैं, तो हम यहां आपके लिए हैं।