Để xác thực lược đồ của bạn, gỡ lỗi lỗi chính tả trong các trường hoặc tìm các trường không được đặt, bạn cần hiểu tất cả các khóa trong bộ sưu tập MongoDB của mình.
Nhiều công ty MongoDB-as-a-service cung cấp một cách dễ dàng để thực hiện điều này ngay trong giao diện người dùng, bao gồm cả ObjectRocket. Người dùng MongoDB dày dạn thường bắt đầu với trình ánh xạ tài liệu-đối tượng (ODM), chẳng hạn như Mongoose cho JS hoặc Mongoengine cho Python, vì vậy họ có thể xây dựng một lược đồ nhất quán cho ứng dụng của mình và giảm lỗi chính tả. (ODM cũng thực hiện xác thực kiểu, vì vậy bạn không vô tình đặt một chuỗi vào một trường có số nguyên và áp dụng toán học cho nó.)
Nếu bạn không có dịch vụ hoặc ODM, có một số phương pháp khác mà bạn có thể sử dụng để truy cập các khóa. Dưới đây là những cách tốt nhất mà chúng tôi đã tìm thấy để lấy tất cả các khóa trong bộ sưu tập MongoDB cho các trường hợp khác nhau.
Một ví dụ
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’] } );
Bạn muốn nhận các khóa duy nhất:
loại, hoạt động, thiết bị, vị trí
MapReduce
Bạn có thể làm điều này với 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" })
Sau khi hoàn tất, hãy chạy lệnh riêng biệt trên tập hợp kết quả để tìm tất cả các khóa:
db.activities_keys.distinct("_id")
Nếu bạn muốn nhận danh sách tất cả các khóa duy nhất trong một tài liệu con, chỉ cần sửa đổi dòng này:
for (var key in this.first_level.second_level.nth_level) { emit(key, null); }
Tổng hợp
Bạn cũng có thể sử dụng kết hợp. Phương pháp này hoạt động với tất cả các trình điều khiển hỗ trợ khung tổng hợp. Với tổng hợp của bạn, $ sample hoặc giới hạn $ có thể được sử dụng để giảm chi phí.
Lưu ý:Chạy với tùy chọn đọc chính có thể ảnh hưởng đến hiệu suất. Cân nhắc chạy với tùy chọn đọc phụ.
Sử dụng tổng hợp với $ objectToArrray (có sẵn trong phiên bản 3.4.4 trở lên) để chuyển đổi tất cả các cặp khóa và giá trị hàng đầu thành các mảng tài liệu theo sau là $ unwind và $ group với $ addToSet để nhận các khóa riêng biệt trong toàn bộ bộ sưu tập.
$$ ROOT để tham khảo tài liệu cấp cao nhất.
db.activities.aggregate([ {"$project":{"arrayofkeyvalue":{"$objectToArray":"$$ROOT"}}}, {"$unwind":"$arrayofkeyvalue"}, {"$group":{"_id":null,"allkeys":{"$addToSet":"$arrayofkeyvalue.k"}}} ])
Nhận khóa trong một tài liệu duy nhất
Bạn cũng có thể sử dụng tính năng tổng hợp để nhận các khóa trong một tài liệu:
db.activities.aggregate([ {"$project":{"arrayofkeyvalue":{"$objectToArray":"$$ROOT"}}}, {"$project":{"keys":"$arrayofkeyvalue.k"}} ])
Mongo shell
Bạn cũng có thể thử điều này trong ứng dụng khách shell mongo:
var allKeys = {}; db.YOURCOLLECTION.find().forEach(function(doc){Object.keys(doc).forEach(function(key){allKeys[key]=1})}); allKeys;
Các trường đầu ra cho một tài liệu
Nếu bạn cần đầu ra của các trường cho một tài liệu trong một bộ sưu tập (vì các trường khác có thể có các khóa hoàn toàn khác nhau), hãy sử dụng như sau:
doc=db.thinks.findOne(); for (key in doc) print(key);
Python
Hoặc, bạn có thể sử dụng Python. Thao tác này trả về tập hợp tất cả các khóa cấp cao nhất trong bộ sưu tập:
#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
Hoặc, bạn có thể sử dụng 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'); }); });
Sau khi đọc bộ sưu tập mới được tạo “allFieldNames”, hãy xóa nó.
db.collection("allFieldNames").remove({}, function (err,result) { db.close(); return; });
Rất nhiều lựa chọn…
Bạn có rất nhiều tùy chọn để nhận các khóa Mongo này! Nếu bạn bị choáng ngợp bởi quản lý MongoDB và muốn tập trung vào mã của mình thay vì quản lý cơ sở dữ liệu, chúng tôi sẵn sàng hỗ trợ bạn. Hãy dùng thử miễn phí nền tảng cơ sở dữ liệu và hỗ trợ găng tay trắng của chúng tôi.