ในการตรวจสอบสคีมาของคุณ แก้ไขข้อบกพร่องสำหรับการพิมพ์ผิดในฟิลด์ หรือค้นหาฟิลด์ที่ไม่ควรตั้งค่า คุณจะต้องทำความเข้าใจคีย์ทั้งหมดในคอลเล็กชัน MongoDB ของคุณ
บริษัท MongoDB-as-a-service หลายแห่งเสนอวิธีง่ายๆ ในการดำเนินการนี้อย่างถูกต้องใน UI รวมถึง ObjectRocket ผู้ใช้ MongoDB ที่มีประสบการณ์มักจะเริ่มต้นด้วยตัวแมปเอกสารวัตถุ (ODM) เช่น Mongoose สำหรับ JS หรือ Mongoengine สำหรับ Python เพื่อให้สามารถสร้างสคีมาที่สอดคล้องกันสำหรับแอปพลิเคชันและลดการพิมพ์ผิด (ODM ยังตรวจสอบประเภทอีกด้วย ดังนั้นคุณจึงไม่ต้องใส่สตริงลงในช่องที่มีจำนวนเต็มและคำนวณทางคณิตศาสตร์โดยไม่ได้ตั้งใจ)
หากคุณไม่มีบริการหรือ 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’] } );
คุณต้องการรับกุญแจพิเศษ:
ประเภท กิจกรรม อุปกรณ์ สถานที่
ลดแผนที่
คุณสามารถทำได้ด้วย 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" })
เมื่อเสร็จแล้ว ให้รันคำสั่งเฉพาะบนคอลเล็กชันผลลัพธ์เพื่อค้นหาคีย์ทั้งหมด:
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 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 ส่งคืนชุดของคีย์ระดับบนสุดทั้งหมดในคอลเล็กชัน:
#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 และต้องการมุ่งเน้นไปที่โค้ดของคุณแทนการจัดการฐานข้อมูล เราอยู่ที่นี่เพื่อคุณ ทดลองใช้แพลตฟอร์มฐานข้อมูลและการสนับสนุน White Gloves ฟรี