在使用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)
})
})
})
})
我基本上想知道是否可以缓存集合和游标的实例。例如,为什么不在服务器启动时获取我只需要一次的集合,并无限期地重用相同的实例?
我真的很想了解整个过程是如何工作的,所以我非常感谢一个很好的链接,详细解释了这些内容。
答案 0 :(得分:1)
查看collection
的node.js驱动程序的源代码,除非您有严格的模式,否则它似乎不会在创建集合时ping MongoDB: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。
答案 1 :(得分:1)
经过一些谷歌搜索后,我发现了this link关于node-mongodb-native
的最佳做法。 Christian Kvalheim回答说,他似乎是图书馆的维护者。他说:
“如果您愿意,可以安全地存储集合对象并重复使用它们”
因此,即使对collection
的调用可能会在strict
模式下进入数据库,也可以重用实际的客户端集合实例。