javascript node.js mongodb meteor smartcollection

javascript - Usando mĂșltiples bases de datos de Mongodb con Meteor.js



node.js smartcollection (3)

¿Es posible que 2 Meteor.Collections recupere datos de 2 servidores de bases de datos mongdb diferentes?

Dogs = Meteor.Collection(''dogs'') // mongodb://192.168.1.123:27017/dogs Cats = Meteor.Collection(''cats'') // mongodb://192.168.1.124:27017/cats


Actualizar

Ahora es posible conectarse a bases de datos remotas / múltiples:

var database = new MongoInternals.RemoteCollectionDriver("<mongo url>"); MyCollection = new Mongo.Collection("collection_name", { _driver: database });

Donde <mongo_url> es una url de mongodb como mongodb://127.0.0.1:27017/meteor (con el nombre de la base de datos)

Hay una desventaja con esto en este momento: No Oplog

Vieja respuesta

Por el momento esto no es posible. Cada aplicación de meteorito está ligada a una base de datos.

Hay algunas maneras de evitarlo, pero puede ser más complicado que valga la pena:

Una opción: usar una aplicación Meteor separada

En su otra aplicación de meteorito (ejemplo que se ejecuta en el puerto 6000 en la misma máquina). Aún puede tener reactividad pero necesita insertar, eliminar y actualizar el proxy mediante una llamada a un método

Servidor:

Cats = Meteor.Collection(''cats'') Meteor.publish("cats", function() { return Cats.find(); }); Meteor.methods(''updateCat, function(id, changes) { Cats.update({_id: id}, {$set:changes}); });

Su aplicación Meteor actual:

var connection = DDP.connect("http://localhost:6000"); connection.subscribe("cats"); Cats = Meteor.Collection(''cats'', {connection: connection}); //To update a collection Cats.call("updateCat", <cat_id>, <changes);

Otra opción: conexión mongodb personalizada

Esto usa el controlador nativo js mongodb del nodo.

Esto se conecta a la base de datos como si lo hiciera en cualquier otra aplicación js del nodo.

No hay reactividad disponible y no puede usar las new Meteor.Collection tipo new Meteor.Collection .

var mongodb = Npm.require("mongodb"); //or var mongodb = Meteor.require("mongodb") //if you use npm package on atmosphere var db = mongodb.Db; var mongoclient = mongodb.MongoClient; var Server = mongodb.Server; var db_connection = new Db(''cats'', new Server("127.0.0.1", 27017, {auto_reconnect: false, poolSize: 4}), {w:0, native_parser: false}); db.open(function(err, db) { //Connected to db ''cats'' db.authenticate(''<db username>'', ''<db password>'', function(err, result) { //Can do queries here db.close(); }); });


Esto es realmente posible, usando una interfaz interna:

var d = new MongoInternals.RemoteCollectionDriver("<mongo url>"); C = new Mongo.Collection("<collection name>", { _driver: d });


La respuesta es : es posible configurar múltiples Meteor.Collections para recuperar datos de diferentes servidores de bases de datos mongdb.

Como la respuesta de @Akshat, puede inicializar su propia instancia de MongoInternals.RemoteCollectionDriver , a través de la cual se pueden crear Mongo.Collection s.

Pero aquí hay algo más de qué hablar. Al ser contrario a la respuesta de @Akshat, encuentro que el soporte de Oplog todavía está disponible bajo tales circunstancias.

Al inicializar el MongoInternals.RemoteCollectionDriver personalizado, NO olvide especificar la URL de Oplog:

var driver = new MongoInternals.RemoteCollectionDriver( "mongodb://localhost:27017/db", { oplogUrl: "mongodb://localhost:27017/local" }); var collection = new Mongo.Collection("Coll", {_driver: driver});

Bajo el capó

Como se describió anteriormente, es bastante simple activar el soporte Oplog. Si desea saber qué sucedió debajo de esas dos líneas de códigos, puede continuar leyendo el resto de la publicación.

En el constructor de RemoteCollectionDriver , se RemoteCollectionDriver una MongoConnection subyacente:

MongoInternals.RemoteCollectionDriver = function ( mongo_url, options) { var self = this; self.mongo = new MongoConnection(mongo_url, options); };

La parte MongoConnection es: si se crea oplogUrl con oplogUrl provisto, se OplogHandle un OplogHandle y comenzará a alinearse con el Oplog ( código fuente ):

if (options.oplogUrl && ! Package[''disable-oplog'']) { self._oplogHandle = new OplogHandle(options.oplogUrl, self.db.databaseName); self._docFetcher = new DocFetcher(self); }

Como este blog ha descrito: Meteor.publish llama Cursor.observeChanges a Cursor.observeChanges para crear una instancia de ObserveHandle , que rastrea automáticamente cualquier cambio futuro que ObserveHandle en la base de datos.

Actualmente hay dos tipos de controladores de observadores: el PollingObserveDriver heredado que toma una estrategia de encuesta y diferencia, y el OplogObseveDriver , que usa de manera efectiva Oplog-tailing para monitorear los cambios en los datos. Para decidir cuál aplicar, observeChanges toma el siguiente procedimiento ( código fuente ):

var driverClass = canUseOplog ? OplogObserveDriver : PollingObserveDriver; observeDriver = new driverClass({ cursorDescription: cursorDescription, mongoHandle: self, multiplexer: multiplexer, ordered: ordered, matcher: matcher, // ignored by polling sorter: sorter, // ignored by polling _testOnlyPollCallback: callbacks._testOnlyPollCallback });

Para hacer que canUseOplog verdadero, se deben cumplir varios requisitos. Un mínimo MongoConnection es: la instancia de MongoConnection subyacente debe tener un OplogHandle válido. Esta es la razón exacta por la que necesitamos especificar oplogUrl al crear MongoConnection