2012-08-15 7 views
10

Estoy recién aprendiendo driver mongodb-native para nodejs.¿Por qué hay mongo.Server y mongo.Db separados en mongodb-native driver?

Me conecto así.

var mongo=require("mongodb") 

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

Y eso funciona. Pero si trato de crear una nueva conexión de base de datos usando el mismo servidor, aparece un error.

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

"Error: Un servidor o instancia ReplSet no se pueden compartir entre varias instancias de DB"

pero funciona si un crea una nueva conexión con el servidor por primera vez.

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

Así que mi pregunta es por qué hay 2 funciones de conexión, uno para el servidor y otro para Db, cuando parece que siempre se deben utilizar juntos?

¿Por qué no funciona así?

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

Quiero hacer mi propia función que hace esto, pero me pregunto si hay alguna otra razón por la que están separados.

Gracias.

Respuesta

3

Aquí hay un enlace a la solución de los documentos mongo, para referencia. (Parece que la misma solución el otro cartel mencionado)

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

El punto de separación de la conexión con el servidor mongo, y luego el PP es para casos como cuando se desea conectar a un servidor ReplSet, o otros params personalizados. De esta forma, tiene un proceso separado para conectarse a un servidor mongodb.

La llamada de conexión a la base de datos está separada simplemente por el caso que tiene aquí: simplemente no quiere conectarse a un servidor mongo y un solo db, sino múltiples dbs. Esta separación de conexión a db y servidor permite esta flexibilidad.

Otra solución: Uso de nodos mongoskin

Mongoskin hace lo que quiere ... que permite la conexión con el servidor y DB todo en un solo comando. No es una solución para mongo-native, pero vale la pena considerarla como una biblioteca alternativa para sus proyectos futuros.

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

Las conexiones de bases de datos separadas podrían hacerse incluso si no tuvieran un constructor de 'Servidor 'separado. Las conexiones múltiples no se hacen usando el constructor 'Db', sino la propiedad' .db' en la instancia del constructor 'Db'. ¿Pero podría explicar qué quiere decir con respecto al servidor ReplSet? ¿Es algo útil sin llamar al constructor 'Db'? –

+0

Bueno, mongo le permite tener servidores mongodb separados ejecutando esa replicación de datos, y se puede conectar a todos ellos, por ejemplo: ('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

+0

respuesta actualizada con más información. mencionado mongo-skin que es un contenedor para mongo-native y se conecta a db y servidor en un comando – Kostia

1

Dado que se trata de dos acciones separadas y distintas: debe conectarse (o ya tiene una conexión) al servidor de BD (computadora) para consultar cualquiera de las bases de datos en ese servidor en particular. Puede crear distintas conexiones de consulta de base de datos para cada una de las bases de datos que desee usar, pero al mismo tiempo utilizará la misma conexión al servidor.
La mayoría de las veces NO querrá crear una conexión de servidor separada para cada una de las bases de datos (si hay muchas) porque el servidor generalmente limita el número de conexiones.

+1

Pero debido al error que recibo, parece que no puedo crear conexiones de bases de datos distintas usando el mismo servidor. Parece que para cada conexión de base de datos, necesito crear una nueva conexión de servidor, incluso si es el mismo servidor. ¿O estoy haciendo algo mal? –

3

Por lo que vale la pena, puede hacer lo que quiere hacer mediante el uso de Db#db(), que no parece estar presente en la documentación oficial que ha estado incluido en el código fuente de db.js como una API pública:

/** 
* 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 
*/ 

por lo que podría hacer

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

Sí, lo vi en los documentos [aquí] (http://mongodb.github.com/node-mongodb-native/api-generated/db.html#id1). Simplemente lo hicieron en la devolución de llamada 'abierta ', pero está utilizando el mismo objeto devuelto por' mongo.Db'. (Simplemente pasan el objeto original a la devolución de llamada). Y eso es útil para saberlo, pero parece hacer que el objeto 'Servidor' sea aún menos necesario. Todavía me pregunto si hay algún propósito especial para la instancia de Servidor independiente. Pero gracias por la respuesta. +1 –

Cuestiones relacionadas