这是之间的比较toArray()
和 a 之后的光标find()
在 Node.js MongoDB 驱动程序中。常用代码:
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
});
这是toArray() https://mongodb.github.io/node-mongodb-native/3.1/api/Cursor.html#toArray上面部分中的代码。
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();
});
根据文档,
调用者有责任确保有
有足够的内存来存储结果。
这是基于光标的方法,使用cursor.forEach() https://mongodb.github.io/node-mongodb-native/3.1/api/Cursor.html#forEach method:
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();
}
);
});
随着forEach()
方法,我们不是获取内存中的所有数据,而是将数据流式传输到我们的应用程序。find()
立即创建游标,因为在我们尝试使用它将提供的某些文档之前,它实际上不会向数据库发出请求。要点是cursor
是描述我们的查询。第二个参数为cursor.forEach
显示发生错误时要执行的操作。
在上述代码的初始版本中,它是toArray()
这强制了数据库调用。这意味着我们需要ALL文件并希望它们位于array
.
注意MongoDB
批量返回数据。下图显示了来自游标(来自应用程序)的请求MongoDB
:
forEach
规模比toArray
因为我们可以处理文档当他们进来时直到我们到达终点。与它对比toArray
- 我们等待的地方ALL要检索的文件和entire数组已构建。这意味着我们没有从驱动程序和数据库系统协同工作将结果批处理到应用程序的事实中获得任何优势。批处理旨在提高内存开销和执行时间方面的效率。如果可以的话,请在您的应用程序中利用它。