Подтвердить что ты не робот

Использование нескольких баз данных Mongodb с Meteor.js

Возможно ли, что 2 Meteor.Collections будет извлекать данные из двух разных серверов базы данных mongdb?

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

Ответ 1

Обновление

Теперь можно подключиться к удаленным/нескольким базам данных:

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

Где <mongo_url> - это URL-адрес mongodb, такой как mongodb://127.0.0.1:27017/meteor (с именем базы данных)

В настоящий момент есть один недостаток: No Oplog

Старый ответ

На данный момент это невозможно. Каждое приложение meteor привязано к одной базе данных.

Есть несколько способов обойти это, но может быть сложнее, что его ценность:

Один вариант - использовать отдельное приложение Meteor

В вашем другом приложении meteor (пример работает на порту 6000 на том же компьютере). У вас все еще есть реактивность, но вам нужно прокси-вставить, удалять и обновлять с помощью вызова метода

Сервер:

Cats = Meteor.Collection('cats')

Meteor.publish("cats", function() {
    return Cats.find();
});

Meteor.methods('updateCat, function(id, changes) {
    Cats.update({_id: id}, {$set:changes});
});

Ваше текущее приложение Meteor:

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);

Другая опция - пользовательское соединение mongodb

Для этого используется родной драйвер node js mongodb.

Это соединение с базой данных, как если бы вы делали это в любом другом приложении node js.

Доступна реактивность нет, и вы не можете использовать коллекции типов 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();
   });
});

Ответ 2

Это возможно, используя внутренний интерфейс:

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

Ответ 3

Ответ ДА: можно настроить несколько Meteor.Collections для получения данных с разных серверов базы данных mongdb.

Как ответ от @Akshat, вы можете инициализировать свой собственный экземпляр MongoInternals.RemoteCollectionDriver, через который может быть создан Mongo.Collection.

Но вот о чем еще поговорить. Будучи вопреки @Akshat ответ, я считаю, что поддержка Oplog по-прежнему доступна при таких обстоятельствах.

При инициализации пользовательского MongoInternals.RemoteCollectionDriver, НЕ НЕ забудьте указать URL-адрес Oplog:

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

Под капотом

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

В конструкторе RemoteCollectionDriver будет создан базовый MongoConnection:

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

Сложная часть: если MongoConnection создается с oplogUrl при условии, что OplogHandle будет инициализирован и начнет завершать Oplog (исходный код):

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

В этом блоге исходный код):

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
});

Чтобы сделать canUseOplog true, необходимо выполнить несколько требований. Минимальный минимальный: базовый экземпляр MongoConnection должен иметь действительный OplogHandle. Это точная причина, по которой нам нужно указать oplogUrl при создании MongoConnection