nodejs - mongodb native查找所有文档

时间:2014-02-07 11:43:07

标签: node.js mongodb

根据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 数据是否每次都没有加载到内存中?

由于

4 个答案:

答案 0 :(得分:14)

最简单的方法是使用Cursorreference):

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