node-mongodb-native何时命中数据库?

时间:2013-02-13 09:54:33

标签: mongodb node-mongodb-native

在使用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)
            })
        })
    })
})

我基本上想知道是否可以缓存集合和游标的实例。例如,为什么不在服务器启动时获取我只需要一次的集合,并无限期地重用相同的实例?

我真的很想了解整个过程是如何工作的,所以我非常感谢一个很好的链接,详细解释了这些内容。

2 个答案:

答案 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集合对象并运行回调。

但是findOnecount会破坏node.js的“懒惰”查询,并会强制它查询数据库以获得结果。

注意:集合中的count不会强制对集合中的所有项目进行“真实”计数。相反,它将从集合元素中提取此信息。

因此,对于第一个代码段,您应该会看到两个查询运行。一个用于findOne,一个用于count,另一个用于第二个代码段,因为在findOne之后创建集合不应强制查询MongoDB。

答案 1 :(得分:1)

经过一些谷歌搜索后,我发现了this link关于node-mongodb-native的最佳做法。 Christian Kvalheim回答说,他似乎是图书馆的维护者。他说:

  

“如果您愿意,可以安全地存储集合对象并重复使用它们”

因此,即使对collection的调用可能会在strict模式下进入数据库,也可以重用实际的客户端集合实例。