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
});