2012-08-15 27 views
10

我刚刚学习了nodejs的mongodb本地驱动程序。为什么mongodb-native驱动中有单独的mongo.Server和mongo.Db?

我这样连接。

var mongo=require("mongodb") 

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

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

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

“错误:服务器或复制集实例不能跨越多个数据库实例共享”

但是如果让新的服务器连接第一个它的工作原理。

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

所以我的问题是,为什么有2个连接功能,一个用于服务器和一个用于分贝,当它好像他们必须一起使用?

为什么它不这样。

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

我想使我自己的功能,这样做,但我想知道是否有其他原因,他们是分开的。

谢谢。

回答

3

下面是对蒙戈文档解决方案的链接,以供参考。 (看起来像其他海报中提到的相同的解决方案)

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

分离到蒙戈服务器的连接点,然后DB是情况下,当你想连接到一个复制集服务器等,或其他自定义参数。这样,你有一个单独的进程连接到一个mongodb服务器。

数据库连接调用是分开的,只是因为你在这里的情况:你不只是想连接到mongo服务器和单个数据库,但多个dbs。连接到数据库和服务器的这种分离可以实现这种灵活性

另一种解决方案:使用节点mongoskin

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

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

即使它们没有单独的“服务器”构造函数,也可以完成单独的数据库连接。多重连接不是使用'Db'构造函数完成的,而是'Db'构造函数实例上的'.db'属性。但是,你能解释一下你对ReplSet服务器的意思吗?没有调用'Db'构造函数是否有用? – 2012-08-29 15:57:19

+0

那么,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') – Kostia 2012-08-29 16:00:12

+0

已更新的答案与更多信息。上面提到的mongo-skin是mongo-native的一个包装,并且通过一个命令连接到db和服务器 – Kostia 2012-08-29 16:04:03

1

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

+1

但由于我得到的错误,似乎我不能使用相同的服务器创建不同的数据库连接。对于每个数据库连接来说,我都需要创建一个新的服务器连接,即使它是同一台服务器。或者我做错了什么? – 2012-08-15 14:30:32

3

对于它的价值,你可以通过使用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"); 
+0

是的,我在文档[这里](http://mongodb.github.com/node-mongodb-native/api-generated/db.html#id1)中看到了这一点。他们只是在'open'回调函数中完成它,但它使用'mongo.Db'返回的相同对象。 (他们只是将原始对象传递给回调函数。)这对知道有帮助,但它似乎使'Server'对象更加不必要。我仍然想知道独立服务器实例是否有一些特殊用途。但谢谢你的答案。 +1 – 2012-08-23 02:20:00

相关问题