0

我无法理解使用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)
            })
        })
    })
})

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

我真的很想了解整个事情是如何工作的,所以我真的很感谢一个很好的链接来详细解释东西。

4

2 回答 2

1

经过一番谷歌搜索,我找到了这个关于node-mongodb-native. 它由似乎是图书馆维护者的 Christian Kvalheim 回答。他说 :

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

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

于 2013-02-13T12:07:48.750 回答
1

查看 node.js 驱动程序的源代码,collection它似乎不会在创建集合时 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)强化了这样一种想法,即如果没有严格,那么它只会尝试创建一个新的 node.js 集合对象并运行回调。

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

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

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

于 2013-02-13T10:50:07.970 回答