Javascript 在Node.js中使用游标时

Javascript 在Node.js中使用游标时,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,何时以及为什么在项目中使用游标 如果我有这个模拟代码 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

何时以及为什么在项目中使用游标

如果我有这个模拟代码

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});
我知道当光标返回时,我有所有的文档(同步的),它有很多,但也在
的内部
,查询就完成了,我有所有的文档


区别在哪里?当使用
var游标
而不是“classic”
时,查找

之间的差异

 cursor = collection.find();
以及:

基本上就是所谓的“方法链接”。这实际上只是一个如何编写代码的观点。因此,像
.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
});

迭代是游标存在的原因。

经典查找对您来说意味着什么?贝壳?它还返回一个游标。shell是REPL这一事实是您直接看到结果的原因,因为它为您调用next,默认“批量大小”为25。不,对不起,我的意思是
collection.find({},{u id:true})。each(函数(err,doc){
查询中使用
每个
我知道这是一个游标。但是我不明白在查询中
每个
之间的区别,而是
var cursor=query
完美!谢谢!最后一个问题。在这个问题中,当我检查
count
返回所有文档时。为什么?`@palsantone看看ode>.count()
采用了两个参数,如
.count(applySkipLimit,callback)
中所述。默认值和不提供第一个参数时发生的情况是考虑
false
并且没有应用任何修改器。基本上我上面所说的,光标还没有执行,只有
.count()
等方法。each()
.toArray()
实际执行。
.count(true,function(err,count){
应用任何修饰符。再次感谢!我没有在文档中看到。谢谢
collection.find({},{_id:true}).each(function(err,doc) {
    // do something with the current doc
});