Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> ฐานข้อมูล

รับชื่อทั้งหมดในคอลเลกชัน MongoDB

เผยแพร่ครั้งแรกเมื่อวันที่ 18 มกราคม 2019 ที่ ObjectRocket.com/blog

ในการตรวจสอบสคีมาของคุณ ดีบักสำหรับการพิมพ์ผิดในฟิลด์ หรือค้นหาฟิลด์ที่คุณไม่ควรตั้งค่า คุณต้องเข้าใจคีย์ทั้งหมดในคอลเลกชัน MongoDB® ของคุณ

รับชื่อทั้งหมดในคอลเลกชัน MongoDB

บริษัท MongoDB-as-a-Service หลายแห่ง รวมถึง ObjectRocket เสนอวิธีง่ายๆ ในการดำเนินการนี้โดยตรงในอินเทอร์เฟซผู้ใช้ (UI) ผู้ใช้ MongoDB ที่มีประสบการณ์มักจะเริ่มต้นด้วยตัวแมปเอกสารอ็อบเจ็กต์ (ODM) เช่น Mongoose สำหรับ JavaScript® หรือ Mongoenginefor Python® เพื่อให้สามารถสร้างสคีมาที่สอดคล้องกันสำหรับแอปพลิเคชันและลดการพิมพ์ผิด ODM ยังตรวจสอบประเภทด้วย ดังนั้นคุณจึงไม่ต้องใส่ astring ลงในช่องที่มีจำนวนเต็มและคำนวณทางคณิตศาสตร์โดยไม่ได้ตั้งใจ

หากไม่มีบริการหรือ ODM คุณสามารถใช้วิธีอื่นในการเข้าถึงคีย์ได้หลายวิธี เราพบวิธีต่อไปนี้ในการรับกุญแจทั้งหมดใน MongoDBcollection สำหรับสถานการณ์ที่แตกต่างกัน

ค้นหาคีย์ 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’] } );

คุณต้องได้รับคีย์เฉพาะ:ประเภท กิจกรรม อุปกรณ์ และตำแหน่ง

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 และ $group ด้วย $addToSet เพื่อรับคีย์เฉพาะจากคอลเล็กชันทั้งหมด

ในตัวอย่างต่อไปนี้ $$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

คุณสามารถใช้ Python เพื่อรับคีย์ MongoDB ตัวอย่างต่อไปนี้จะคืนค่าชุดของคีย์ระดับบนสุดทั้งหมดในคอลเล็กชัน:

#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 เสนอวิธีรับกุญแจอีกทางหนึ่ง ดังแสดงในตัวอย่างต่อไปนี้:

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 และต้องการมุ่งเน้นไปที่โค้ดของคุณแทนการจัดการฐานข้อมูล เราพร้อมให้ความช่วยเหลือคุณ

เรียนรู้เพิ่มเติมเกี่ยวกับ Rackspace DBA Services

ใช้แท็บคำติชมเพื่อแสดงความคิดเห็นหรือถามคำถาม คุณสามารถเริ่มการสนทนากับเราได้