为啥 mongodb-native 驱动程序中有单独的 mongo.Server 和 mongo.Db?

Posted

技术标签:

【中文标题】为啥 mongodb-native 驱动程序中有单独的 mongo.Server 和 mongo.Db?【英文标题】:Why is there separate mongo.Server and mongo.Db in mongodb-native driver?为什么 mongodb-native 驱动程序中有单独的 mongo.Server 和 mongo.Db? 【发布时间】:2012-08-11 19:54:05 【问题描述】:

我正在学习 nodejs 的 mongodb-native 驱动程序。

我是这样连接的。

var mongo=require("mongodb")

var serv=mongo.Server("localhost", 27017)
var dbase=mongo.Db("MyDatabase", serv)

这行得通。但是,如果我尝试使用同一台服务器创建新的数据库连接,则会出现错误。

var dbase2=mongo.Db("MyDatabase2", serv)

“错误:一个 Server 或 ReplSet 实例不能在多个 Db 实例之间共享”

但如果先建立新的服务器连接,它会起作用。

var serv2=mongo.Server("localhost", 27017)
var dbase2=mongo.Db("MyDatabase2", serv2)

所以我的问题是为什么有 2 个连接函数,一个用于服务器,一个用于 Db,而它们似乎必须始终一起使用?

为什么不这样。

var dbase=mongo.Db("localhost", 27017, "MyDatabase")

我想创建自己的函数来执行此操作,但我想知道它们是分开的是否还有其他原因。

谢谢。

【问题讨论】:

【参考方案1】:

这里是 mongo 文档上解决方案的链接,供参考。 (似乎与其他海报提到的相同解决方案)

http://mongodb.github.com/node-mongodb-native/markdown-docs/database.html#sharing-the-connections-over-multiple-dbs

分离到 mongo 服务器的连接,然后是 DB,用于连接到 ReplSet 服务器或其他自定义参数的情况。这样,您就有了一个连接到 mongodb 服务器的单独进程。

数据库连接调用是分开的,只是因为你在这里的情况:你不只是想连接到一个 mongo 服务器和一个单独的数据库,而是多个数据库。这种连接到数据库和服务器的分离允许这种灵活性。

另一种解决方案:使用 node-mongoskin

Mongoskin 做你想做的事......它允许在一个命令中连接到服务器和数据库。不是 mongo-native 的解决方案,但值得考虑作为您未来项目的替代库。

var mongo = require('mongoskin');
var db = mongo.db('localhost:27017/testDB');

【讨论】:

即使没有单独的Server 构造函数,也可以完成单独的数据库连接。多个连接不是使用Db 构造函数完成的,而是使用Db 构造函数实例上的.db 属性完成的。但是您能解释一下您对 ReplSet 服务器的含义吗?不调用Db构造函数有什么用吗? 嗯,mongo 让您拥有运行复制数据的单独 mongodb 服务器,您可以将它们全部连接到一起,例如:('192.168.0.1:27017/?auto_reconnect=true','192.168.0.2 :27017/?auto_reconnect=true','192.168.0.3:27017/?auto_reconnect=true') 更新了答案,提供更多信息。提到了 mongo-skin,它是 mongo-native 的包装器,在一个命令中连接到数据库和服务器【参考方案2】:

对于它的价值,您可以使用Db#db() 做您想做的事情,它似乎没有出现在官方文档中,但在db.js 的源代码中作为公共API 列出:

/**
* Create a new Db instance sharing the current socket connections.
*
* @param String dbName the name of the database we want to use.
* @return Db a db instance using the new database.
* @api public
*/

所以你可以这样做

var serv=mongo.Server("localhost", 27017);
var dbase=mongo.Db("MyDatabase", serv);
var dbase2=dbase.db("MyDatabase2");

【讨论】:

是的,我确实在文档here 中看到了这一点。他们只是在open 回调中做到了,但它使用的是从mongo.Db 返回的相同对象。 (他们只是将原始对象传递给回调。)这有助于了解,但它似乎使Server 对象变得更加不必要。我仍然只是想知道独立服务器实例是否有一些特殊用途。但感谢您的回答。 +1【参考方案3】:

因为这是两个独立且不同的操作 - 您必须连接(或已经连接)到数据库服务器(计算机)才能查询该特定服务器上的任何数据库。您可以为要使用的每个数据库创建不同的数据库查询连接,但同时您将使用与服务器的相同连接。 大多数情况下,您不希望为每个数据库(如果有很多)创建单独的服务器连接,因为服务器通常会限制连接数。

【讨论】:

但是由于我得到的错误,我似乎无法使用同一台服务器创建不同的数据库连接。似乎对于每个数据库连接,我都需要创建一个新的服务器连接,即使它是同一台服务器。还是我做错了什么?

以上是关于为啥 mongodb-native 驱动程序中有单独的 mongo.Server 和 mongo.Db?的主要内容,如果未能解决你的问题,请参考以下文章

为啥'char'值必须有单引号而不是双引号? [复制]

protobuf 中有单字节类型吗?

C# 中带有单选按钮的 groupBox 的事件处理程序

onclick方法参数中有单引号双引号空格

FFmpeg用concat合并视频时,文件名中有单引号的转义方法

sql语句中有单引号怎么办