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 SÍ : 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