Почему есть отдельный mongo.Server и mongo.Db в mongodb-native driver?

132
14

Я просто изучаю собственный драйвер mongodb для nodejs.


Я подключаюсь так.


var mongo=require("mongodb")

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


И это работает. Но если я попытаюсь создать новое соединение с базой данных с использованием одного и того же сервера, я получаю сообщение об ошибке.


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

"Ошибка: экземпляр сервера или ReplSet не может использоваться совместно несколькими экземплярами Db"


Но он работает, если сначала создать новое подключение к серверу.


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

Итак, мой вопрос в том, почему есть две функции соединения: одна для Сервера и одна для Db, когда кажется, что они всегда должны использоваться вместе?


Почему это не так.


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

Я хочу сделать свою собственную функцию, которая делает это, но мне интересно, есть ли другая причина, по которой они являются отдельными.


Спасибо.

спросил(а) 2012-08-15T17:00:00+04:00 8 лет, 1 месяц назад
1
Решение
80

Вот ссылка на решение в документах mongo для справки. (похоже на то же самое решение, о котором говорил другой плакат)


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


Точка разделения соединения с сервером mongo, а затем DB предназначена для случаев, например, когда вы хотите подключиться к серверу ReplSet или другим настраиваемым параметрам. Таким образом, у вас есть отдельный процесс подключения к серверу mongodb.


Вызов соединения с базой данных разделен просто из-за того, что вы здесь: вы просто не хотите подключаться к серверу mongo и одному db, но несколько dbs. Такое разделение соединения с db и сервером позволяет эту гибкость.

Другое решение: используйте node -mongoskin


Mongoskin делает то, что вы хотите... он позволяет подключаться к серверу и db в одной команде. Не решение для mongo-native, но стоит рассматривать как альтернативную библиотеку для ваших будущих проектов.


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

ответил(а) 2012-08-29T18:38:00+04:00 8 лет назад
80

Для чего вы можете сделать то, что хотите, используя 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");

ответил(а) 2012-08-23T04:42:00+04:00 8 лет назад
57

Поскольку это два отдельных и отдельных действия - вам нужно подключиться (или уже иметь соединение) с сервером БД (компьютером), чтобы запросить любую из баз данных на этом конкретном сервере. Вы можете создавать отдельные подключения к базе данных для каждой из баз данных, которые вы хотите использовать, но в то же время вы будете использовать одно и то же соединение с сервером.

Большую часть времени вы НЕ хотите создавать отдельное соединение с сервером для каждой из баз данных (если их много), поскольку сервер обычно ограничивает количество подключений.

ответил(а) 2012-08-15T17:17:00+04:00 8 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема