find()方法和Node.js的驱动程序游标
var MongoClient = require('mongodb').MongoClient,
assert = require('assert');
MongoClient.connect('mongodb://localhost:27017/crunchbase', function(err, db) {
assert.equal(err, null);
console.log("Successfully connected to MongoDB.");
var query = {
"category_code": "biotech"
};
db.collection('companies').find(query).toArray(function(err, docs) {
assert.equal(err, null);
assert.notEqual(docs.length, 0);
docs.forEach(function(doc) {
console.log(doc.name + " is a " + doc.category_code + " company.");
});
db.close();
});
});
注意,通话.toArray
正在为获取整个数据集的应用程序。
var MongoClient = require('mongodb').MongoClient,
assert = require('assert');
MongoClient.connect('mongodb://localhost:27017/crunchbase', function(err, db) {
assert.equal(err, null);
console.log("Successfully connected to MongoDB.");
var query = {"category_code": "biotech"};
var cursor = db.collection('companies').find(query);
function(doc) {
cursor.forEach(
console.log(doc.name + " is a " + doc.category_code + " company.");
},
function(err) {
assert.equal(err, null);
return db.close();
}
);
});
注意,光标由find()
返回分配给var cursor
。采用这种方法,我们不是一次性获取memort中的所有数据并使用数据,而是将数据传输到我们的应用程序。 find()
可以立即创建游标,因为它实际上并没有向数据库发出请求,除非我们尝试使用它将提供的某些文档。 cursor
的要点是描述我们的查询。 cursor.forEach
的第二个参数显示驱动程序耗尽或发生错误时要执行的操作。
在上述代码的初始版本中,它是toArray()
,它强制数据库调用。这意味着我们需要所有的文件,并希望他们在array
。
另外,MongoDB
以批处理格式返回数据。下面显示的图像,从游标请求(从应用程序)MongoDB
forEach
比toArray
更好,因为我们可以处理文档,因为他们进来,直到我们到达终点。将其与toArray
对比 - 我们在那里等待全部要检索的文件和整个数组已建成。这意味着我们没有从驱动程序和数据库系统一起工作将结果批量分发到应用程序的事实中获得任何优势。批处理意味着提供内存开销和执行时间方面的效率。 充分利用它,如果你可以在你的应用。
我觉得你的问题是在你应该问的话题上徘徊。如果你确实收到*“光标找不到”*异常,那么故障问题将是你实施的代码。关于游标“实际是什么”的更广泛的讨论更多的是“更广泛的设计问题”,而不是解决特定编程问题的东西,比如本网站的用途,因此*“对游标过度咆哮,代码不够这可能会导致问题“*。就目前而言,你的问题看起来像是在要求一篇论文解释游标是什么。只需显示一些代码。 –
问题是,这些例外的发生取决于环境。我们目前不知道,哪个参数(内存,CPU,什么)是至关重要的参数。所以我对一些**背景感兴趣**。我们的代码看起来像'ds.find(Translation.class).asList()'(ds是Morphia.Datastrore)。 – BairDev
如果您在副本集中运行mongo,则如果您的服务器决定在另一个主节点上,则光标将会丢失。 – froderik