Ответ ДА: можно настроить несколько 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);
}
Как описано в этом блоге: Meteor.publish
внутренне вызывает Cursor.observeChanges
для создания экземпляра ObserveHandle
. , который автоматически отслеживает любые будущие изменения, происходящие в базе данных.
В настоящее время существует два типа драйверов-наблюдателей: устаревший PollingObserveDriver
, использующий стратегию опроса и сравнения, и OplogObseveDriver
, эффективно использующий Oplog-хвост для отслеживания изменений данных. Чтобы решить, какой из них применить, observeChanges
выполняет следующую процедуру (исходный код):
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
истинным, необходимо выполнить несколько требований. Самый минимальный: базовый экземпляр MongoConnection
должен иметь действительный OplogHandle
. Именно по этой причине нам нужно указать oplogUrl
при создании MongoConnection
person
Haizi
schedule
18.12.2015