在Node.js中使用游标时

时间:2014-07-24 07:13:14

标签: javascript node.js mongodb

何时为什么在项目中使用Cursor?

如果我有这个模拟代码

var mongoClient = require('mongodb').MongoClient;


mongoClient.connect('mongodb://localhost:27017/tut3',function(err,db){
    if(err)throw err;

    var collection = db.collection('messages');


    collection.find({},{_id:true}).each(function(err,doc){
        console.log("---- CLASSIC ----")
        console.dir(doc);
            //stuff//
    });

    var cursor = collection.find({},{_id:true});

    cursor.each(function(err,doc){
        console.log("---- CURSOR ----")
        console.dir(doc);
        //stuff2
    });

})

例如,集合消息很大。

//stuff//stuff2

之间存在差异

我知道如果我这样做

var cursor = collection.find({},{_id:true});

我知道当光标返回时我拥有所有文件(同步)并且它有许多methods,但也在stuff内,查询已完成,我有所有文件...

区别在哪里?当使用var cursor代替“经典”find

1 个答案:

答案 0 :(得分:1)

之间的区别
 cursor = collection.find();

collection.find().each(function(err,doc) {

基本上是所谓的"方法链接"。它真的只是你想如何编写代码的意见。因此,使用.each()等方法执行的操作仍然只是一个可以选择在左侧返回的游标对象。

"光标"尚未被执行"直到调用这样的方法。这意味着"修饰符"可以在不执行的情况下应用,如:

cursor = cursor.skip(10);
cursor = cursor.limit(100);

因为所有修饰符也会向左返回一个光标。

这基本上是在"方法链接中应用的原则",无论什么"类型"从左边返回可以"链接"在右边:

collection.find().skip(10).limit(100).each(function(err,doc) {

如果你正在处理"小"您可以在光标上调用.toArray()方法的结果集:

collection.find({},{_id:true}).toArray(function(err,array) {
   console.log( array ); // everything
});

但如果有1000或者数百万的结果,你可能不想在内存中加载所有这些。这是使用迭代器处理的地方:

collection.find({},{_id:true}).each(function(err,doc) {
    // do something with the current doc
});

迭代是游标存在的原因。