Đây là so sánh giữa toArray()
và con trỏ sau find()
trong trình điều khiển Node.js MongoDB. Mã chung:
var MongoClient = require('mongodb').MongoClient,
assert = require('assert');
MongoClient.connect('mongodb://localhost:27017/crunchbase', function (err, db) {
assert.equal(err, null);
console.log('Successfully connected to MongoDB.');
const query = { category_code: "biotech" };
// toArray() vs. cursor code goes here
});
Đây là toArray()
mã có trong phần trên.
db.collection('companies').find(query).toArray(function (err, docs) {
assert.equal(err, null);
assert.notEqual(docs.length, 0);
docs.forEach(doc => {
console.log(`${doc.name} is a ${doc.category_code} company.`);
});
db.close();
});
Theo tài liệu,
Người gọi có trách nhiệm đảm bảo rằng có đủ bộ nhớ để lưu kết quả.
Đây là phương pháp dựa trên con trỏ, sử dụng cursor.forEach()
phương pháp:
const cursor = db.collection('companies').find(query);
cursor.forEach(
function (doc) {
console.log(`${doc.name} is a ${doc.category_code} company.`);
},
function (err) {
assert.equal(err, null);
return db.close();
}
);
});
Với forEach()
cách tiếp cận, thay vì tìm nạp tất cả dữ liệu trong bộ nhớ, chúng tôi đang truyền dữ liệu vào ứng dụng của mình. find()
tạo một con trỏ ngay lập tức vì nó không thực sự đưa ra yêu cầu đối với cơ sở dữ liệu cho đến khi chúng tôi cố gắng sử dụng một số tài liệu mà nó sẽ cung cấp. Điểm của cursor
là để mô tả truy vấn của chúng tôi. Tham số thứ hai cho cursor.forEach
hiển thị những việc cần làm khi xảy ra lỗi.
Trong phiên bản đầu tiên của đoạn mã trên, nó là toArray()
mà buộc phải gọi cơ sở dữ liệu. Điều đó có nghĩa là chúng tôi cần TẤT CẢ các tài liệu và muốn chúng nằm trong một array
.
Lưu ý rằng MongoDB
trả về dữ liệu theo lô. Hình ảnh bên dưới hiển thị các yêu cầu từ con trỏ (từ ứng dụng) tới MongoDB
:
forEach
mở rộng quy mô tốt hơn toArray
bởi vì chúng tôi có thể xử lý tài liệu khi chúng đến cho đến khi chúng ta đi đến cuối cùng. Đối chiếu với toArray
- nơi chúng tôi chờ đợi TẤT CẢ tài liệu được truy xuất và toàn bộ mảng được xây dựng. Điều này có nghĩa là chúng tôi không nhận được bất kỳ lợi ích nào từ thực tế là trình điều khiển và hệ thống cơ sở dữ liệu đang làm việc cùng nhau để đưa ra kết quả hàng loạt cho ứng dụng của bạn. Batch có nghĩa là để cung cấp hiệu quả về chi phí bộ nhớ và thời gian thực hiện. Hãy tận dụng nó trong ứng dụng của bạn, nếu bạn có thể.