为啥 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?的主要内容,如果未能解决你的问题,请参考以下文章