在使用node-mongodb-native时,我很难理解数据库被命中的确切时间。在那上面找不到任何参考资料。因为一切都是基于回调的,它给我的感觉是每一个调用都会命中数据库……例如,这两个片段在数据库命中次数方面有什么不同:
// ---- 1
db.collection('bla', function(err, coll) {
coll.findOne({'blo': 'bli'}, function(err, doc) {
coll.count(function(err, count) {
console.log(doc, count)
})
})
})
// ---- 2
db.collection('bla', function(err, coll) {
coll.findOne({'blo': 'bli'}, function(err, doc) {
db.collection('bla', function(err, coll) {
coll.count(function(err, count) {
console.log(doc, count)
})
})
})
})我基本上想知道我是否可以缓存集合和游标的实例。例如,为什么不在服务器启动时获取我只需要一次的集合,然后无限期地重用相同的实例呢?
我真的很想了解整个事情是如何工作的,所以我真的很感激能有一个很好的链接来详细解释这些东西。
发布于 2013-02-13 18:50:08
查看collection的node.js驱动程序的源代码,它似乎不会在创建集合时ping MongoDB,除非您有严格的模式on:https://github.com/mongodb/node-mongodb-native/blob/master/Readme.md#strict-mode
我查看的源代码( https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/db.js#L446 )强化了这样一种想法:如果strict没有打开,那么它只会尝试创建一个新的node.js集合对象并运行回调。
然而,findOne和count将打破node.js的“懒惰”查询,并强制它查询数据库才能获得结果。
注意:集合中的count不会强制对集合中的所有项进行“真”计数。取而代之的是,它将从集合元中装饰此信息。
因此,对于第一个代码片段,您应该会看到运行了两个查询。一个用于findOne,一个用于count,还有两个用于第二个代码片段,因为在findOne之后创建集合不应该强制查询MongoDB。
发布于 2013-02-13 20:07:49
经过一些谷歌搜索,我找到了关于node-mongodb-native的最佳实践的this link。这个问题是由克里斯蒂安·克瓦海姆回答的,他似乎是图书馆的维护者。他说:
“如果愿意,您可以安全地存储集合对象并重用它们”
因此,即使在strict模式下对collection的调用可能会命中数据库,也可以重用实际的客户端集合实例。
https://stackoverflow.com/questions/14850715
复制相似问题