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

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

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

ในการตรวจสอบสคีมาของคุณ แก้ไขข้อบกพร่องสำหรับการพิมพ์ผิดในฟิลด์ หรือค้นหาฟิลด์ที่ไม่ควรตั้งค่า คุณจะต้องทำความเข้าใจคีย์ทั้งหมดในคอลเล็กชัน 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 ฟรี