Javascript 为什么mongodb本机驱动程序中有单独的mongo.Server和mongo.Db?

Javascript 为什么mongodb本机驱动程序中有单独的mongo.Server和mongo.Db?,javascript,node.js,mongodb,node-mongodb-native,Javascript,Node.js,Mongodb,Node Mongodb Native,我正在学习nodejs的mongodb本机驱动程序 我是这样联系的 var mongo=require("mongodb") var serv=mongo.Server("localhost", 27017) var dbase=mongo.Db("MyDatabase", serv) var dbase=mongo.Db("localhost", 27017, "MyDatabase") 这就行了。但是如果我尝试使用同一台服务器创建一个新的数据库连接,我会得到一个错误 var dbase

我正在学习nodejs的mongodb本机驱动程序

我是这样联系的

var mongo=require("mongodb")

var serv=mongo.Server("localhost", 27017)
var dbase=mongo.Db("MyDatabase", serv)
var dbase=mongo.Db("localhost", 27017, "MyDatabase")
这就行了。但是如果我尝试使用同一台服务器创建一个新的数据库连接,我会得到一个错误

var dbase2=mongo.Db("MyDatabase2", serv)
“错误:无法在多个Db实例之间共享服务器或ReplSet实例”

但是,如果一个服务器先建立一个新的服务器连接,它就可以工作

var serv2=mongo.Server("localhost", 27017)
var dbase2=mongo.Db("MyDatabase2", serv2)
所以我的问题是,为什么有两个连接函数,一个用于服务器,一个用于数据库,而它们似乎总是必须一起使用

为什么不这样呢

var mongo=require("mongodb")

var serv=mongo.Server("localhost", 27017)
var dbase=mongo.Db("MyDatabase", serv)
var dbase=mongo.Db("localhost", 27017, "MyDatabase")
我想创建自己的函数来实现这一点,但我想知道它们是分开的是否还有其他原因


谢谢。

因为这是两个独立且不同的操作-您必须连接(或已经连接)到数据库服务器(计算机),才能查询该特定服务器上的任何数据库。您可以为要使用的每个数据库创建不同的数据库查询连接,但同时将使用与服务器相同的连接。

大多数情况下,您不希望为每个数据库(如果有多个数据库)创建单独的服务器连接,因为服务器通常会限制连接的数量。

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

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

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

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

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

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

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

但是由于我得到的错误,似乎我无法使用同一台服务器创建不同的数据库连接。似乎对于每个数据库连接,我都需要创建一个新的服务器连接,即使它是同一个服务器。还是我做错了什么?是的,我在文件里看到了。他们只是在
open
回调中做的,但它使用的是从
mongo.Db
返回的相同对象。(它们只是将原始对象传递到回调中。)知道这一点很有帮助,但这似乎使
服务器
对象更不必要。我还在想,独立服务器实例是否有特殊用途。但是谢谢你的回答+1即使没有单独的
服务器
构造函数,也可以进行单独的数据库连接。多个连接不是使用
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的包装器,通过一个命令连接到db和服务器