Computer >> Máy Tính >  >> Lập trình >> Cơ sở dữ liệu

Nhận tất cả các tên trong bộ sưu tập MongoDB

Được xuất bản lần đầu vào ngày 18 tháng 1 năm 2019 tại ObjectRocket.com/blog.

Để 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 bạn không nên đặt, bạn cần hiểu tất cả các khóa trong MongoDB®collection của mình.

Nhận tất cả các tên trong bộ sưu tập MongoDB

Nhiều công ty MongoDB-as-a-Service, bao gồm cả ObjectRocket, cung cấp một cách dễ dàng để thực hiện việc này ngay trong giao diện người dùng (UI). Các MongoDBusers dày dạn kinh nghiệm 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 JavaScript® hoặc Mongoenginefor 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 dấu gạch ngang vào một trường có cá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, bạn có thể sử dụng một số phương pháp khác để tích lũy khóa. Chúng tôi đã tìm thấy các phương pháp sau để lấy tất cả các khóa trong MongoDBcollection cho các trường hợp khác nhau.

Tìm khóa MongoDB

Giả sử bạn có ví dụ sau:

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 cần có các khóa duy nhất:loại, hoạt động, thiết bị và vị trí.

MapReduce

Bạn có thể lấy chìa khóa với MapReduce bằng cách sử dụng thao tác sau:

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 thao tác kết thúc, hãy chạy distinct sau lệnh trên bộ sưu tậ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, hãy sửa đổi dòng sau:

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 các tổng hợp của bạn, hãy sử dụng $sample hoặc $limit 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 với tùy chọn đọc phụ.

Sử dụng kết 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$group với $addToSet để nhận các khóa riêng biệt trong toàn bộ bộ sưu tập.

Trong ví dụ sau, $$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"}}} ])

Bạn cũng có thể sử dụng tính năng tổng hợp để lấy các khóa trong một tài liệu bằng cách sử dụng lệnh sau:

db.activities.aggregate([ {"$project":{"arrayofkeyvalue":{"$objectToArray":"$$ROOT"}}}, {"$project":{"keys":"$arrayofkeyvalue.k"}} ])

Mongo shell

Bạn cũng có thể nhận các khóa trong ứng dụng khách Mongo shell bằng cách sử dụng lệnh sau:

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

Bởi vì mỗi tài liệu trong một bộ sưu tập có thể có các khóa hoàn toàn khác nhau, bạn có thể 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. Sử dụng lệnh sau để thực hiện việc này:

doc=db.thinks.findOne(); for (key in doc) print(key);

Python

Bạn có thể sử dụng Python để lấy các khóa MongoDB. Ví dụ sau 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

JavaScript cung cấp một cách khác để lấy các khóa, như được hiển thị trong ví dụ sau:

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 , 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.

Tìm hiểu thêm về Dịch vụ Rackspace DBA.

Sử dụng tab Phản hồi để đưa ra bất kỳ nhận xét hoặc đặt câu hỏi nào. Bạn cũng có thể bắt đầu cuộc trò chuyện với chúng tôi.