何时为什么在项目中使用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
?
答案 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
});
迭代是游标存在的原因。