根据nodejs的mongodb手册中的示例,我发现db中的所有文档如下
mongo.Db.connect(mongoUri, function (err, db) {
if (err) {
console.log(err);
}
else {
db.collection('test').find().toArray(function(e, d) {
console.log(d.length);
db.close();
});
}
});
现在我注意到整个集合被转换为数组。随着数据集的增长,这将不是理想的方法。无论如何 stream 数据是否每次都没有加载到内存中?
由于
答案 0 :(得分:14)
最简单的方法是使用Cursor
(reference):
var cursor = db.collection('test').find();
// Execute the each command, triggers for each document
cursor.each(function(err, item) {
// If the item is null then the cursor is exhausted/empty and closed
if(item == null) {
db.close(); // you may not want to close the DB if you have more code....
return;
}
// otherwise, do something with the item
});
如果需要进行大量计算,您可以考虑Map-Reduce(reference)是否符合您的需求,因为代码将在DB服务器上执行,而不是在本地执行。
答案 1 :(得分:10)
您可以通过在返回的游标上调用stream()
来传输node.js本机驱动程序查询的结果:
var stream = collection.find().stream();
stream.on('data', function(doc) {
console.log(doc);
});
stream.on('error', function(err) {
console.log(err);
});
stream.on('end', function() {
console.log('All done!');
});
答案 2 :(得分:0)
限制查询会是一个选项吗?字面意思是db.collection.find()。limit()?在将命令发送到服务器之前解析限制,因此它仅扫描限制中的数据量。
答案 3 :(得分:0)
现代方式
postgresql