The answer is **YES**: it is possible set up multiple Meteor.Collections to be retrieving data from different mongdb database servers.
As the answer from @Akshat, you can initialize your own `MongoInternals.RemoteCollectionDriver` instance, through which `Mongo.Collection`s can be created.
But here's something more to talk about. Being contrary to @Akshat answer, I find that Oplog support is still available under such circumstance.
When initializing the custom `MongoInternals.RemoteCollectionDriver`, **DO NOT** forget to specify the Oplog url:
var driver = new MongoInternals.RemoteCollectionDriver(
"mongodb://localhost:27017/db",
{
oplogUrl: "mongodb://localhost:27017/local"
});
var collection = new Mongo.Collection("Coll", {_driver: driver});
### Under the hood
*As described above, it is fairly simple to activate Oplog support. If you do want to know what happened beneath those two lines of code, you can continue reading the rest of the post.*
In the constructor of `RemoteCollectionDriver`, an underlying `MongoConnection` will be created:
MongoInternals.RemoteCollectionDriver = function (
mongo_url, options) {
var self = this;
self.mongo = new MongoConnection(mongo_url, options);
};
The tricky part is: if `MongoConnection` is created with `oplogUrl` provided, an `OplogHandle` will be initialized, and starts to tail the Oplog ([source code](
[To see links please register here]
)):
if (options.oplogUrl && ! Package['disable-oplog']) {
self._oplogHandle = new OplogHandle(options.oplogUrl, self.db.databaseName);
self._docFetcher = new DocFetcher(self);
}
As this [blog](
[To see links please register here]
) has described: `Meteor.publish` internally calls `Cursor.observeChanges` to create an `ObserveHandle` instance, which automatically tracks any future changes occurred in the database.
Currently there are two kinds of observer drivers: the legacy `PollingObserveDriver` which takes a poll-and-diff strategy, and the `OplogObseveDriver`, which effectively use Oplog-tailing to monitor data changes. To decide which one to apply, `observeChanges` takes the following procedure ([source code](
[To see links please register here]
)):
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
});
In order to make `canUseOplog` true, several requirements should be met. A bare minimal one is: the underlying `MongoConnection` instance should have a valid `OplogHandle`. This is the exact reason why we need to specify `oplogUrl` while creating `MongoConnection`