Usando vários bancos de dados do Mongodb com o Meteor.js

É possível que 2 Meteor.Collections dados de 2 servidores diferentes de database mongdb?

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

Atualizar

Agora é possível conectar-se a bancos de dados remotos / múltiplos:

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

Onde é uma URL do mongodb, como mongodb://127.0.0.1:27017/meteor (com o nome do database)

Há uma desvantagem nisso no momento: No Oplog

Resposta antiga

No momento, isso não é possível. Cada aplicativo de meteor está vinculado a um database.

Existem algumas maneiras de contornar isso, mas pode ser mais complicado que valha a pena:

Uma opção – use um aplicativo separado do Meteor

No seu outro aplicativo de meteor (exemplo rodando na porta 6000 na mesma máquina). Você ainda pode ter reatividade, mas precisa inserir, remover e atualizar os proxy por meio de uma chamada de 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}); }); 

Seu aplicativo atual do Meteor:

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

Outra opção - conexão mongodb personalizada

Isso usa o driver nativo do nó js mongodb.

Isso está se conectando ao database como se você fizesse em qualquer outro aplicativo do nó js.

Não reatividade disponível e você não pode usar as 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('', '', function(err, result) { //Can do queries here db.close(); }); }); 

Isso é realmente possível, usando uma interface interna:

 var d = new MongoInternals.RemoteCollectionDriver(""); C = new Mongo.Collection("", { _driver: d }); 

A resposta é SIM : é possível configurar múltiplos Meteor.Collections para recuperar dados de diferentes servidores de database mongdb.

Como resposta do @Akshat, você pode inicializar sua própria instância do MongoInternals.RemoteCollectionDriver , através da qual o Mongo.Collection s pode ser criado.

Mas aqui está algo mais para falar. Sendo contrário à resposta do @Akshat, acho que o suporte do Oplog ainda está disponível sob tal circunstância.

Ao inicializar o personalizado MongoInternals.RemoteCollectionDriver , NÃO se esqueça de especificar o URL do Oplog:

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

Sob o capô

Como descrito acima, é bastante simples ativar o suporte do Oplog. Se você quiser saber o que aconteceu abaixo dessas duas linhas de código, continue lendo o restante da postagem.

No construtor de RemoteCollectionDriver , um MongoConnection subjacente será criado:

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

A parte complicada é: se MongoConnection for criado com o oplogUrl fornecido, um OplogHandle será inicializado e começará a seguir o Oplog ( código-fonte ):

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

Como este blog descreve: Meteor.publish chama internamente Cursor.observeChanges para criar uma ocorrência ObserveHandle , que rastreia automaticamente quaisquer mudanças futuras ocorridas no database.

Atualmente, existem dois tipos de drivers de observador: o PollingObserveDriver herdado, que usa uma estratégia de pesquisa e comparação, e o OplogObseveDriver , que usa efetivamente o Oplog-tailing para monitorar as alterações de dados. Para decidir qual deles aplicar, observeChanges usa o seguinte procedimento ( código-fonte ):

 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 tornar o canUseOplog verdadeiro, vários requisitos devem ser atendidos. Um mínimo básico é: a instância subjacente do MongoConnection deve ter um OplogHandle válido. Esta é a razão exata pela qual precisamos especificar o oplogUrl ao criar o MongoConnection