Использование нескольких баз данных 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
Ответы
Ответ 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