Est-il possible que 2 Meteor.Collections
Récupèrent des données de 2 serveurs de base de données mongodb différents?
Dogs = Meteor.Collection('dogs') // mongodb://192.168.1.123:27017/dogs
Cats = Meteor.Collection('cats') // mongodb://192.168.1.124:27017/cats
Il est désormais possible de se connecter à des bases de données distantes/multiples:
var database = new MongoInternals.RemoteCollectionDriver("<mongo url>");
MyCollection = new Mongo.Collection("collection_name", { _driver: database });
Où <mongo_url>
est une URL mongodb telle que mongodb://127.0.0.1:27017/meteor
(avec le nom de la base de données)
Il y a un inconvénient à cela pour le moment: pas d'Oplog
Pour le moment, ce n'est pas possible. Chaque application météore est liée à une base de données.
Il existe plusieurs façons de contourner ce problème, mais cela peut être plus compliqué que cela en vaut la peine:
Dans votre autre application Meteor (exemple fonctionnant au port 6000 sur la même machine). Vous pouvez toujours avoir une réactivité, mais vous devez proxy proxy insère, supprime et met à jour via un appel de méthode
Serveur:
Cats = Meteor.Collection('cats')
Meteor.publish("cats", function() {
return Cats.find();
});
Meteor.methods('updateCat, function(id, changes) {
Cats.update({_id: id}, {$set:changes});
});
Votre application Meteor actuelle:
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);
Celui-ci utilise le pilote natif du nœud js mongodb.
Cela se connecte à la base de données comme si vous le feriez dans n'importe quelle autre application node js.
Il y a non réactivité disponible et vous ne pouvez pas utiliser le new Meteor.Collection
collections de type.
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();
});
});
C'est en fait possible, en utilisant une interface interne:
var d = new MongoInternals.RemoteCollectionDriver("<mongo url>");
C = new Mongo.Collection("<collection name>", { _driver: d });
La réponse est [~ # ~] oui [~ # ~] : il est possible de configurer plusieurs Meteor.Collections pour récupérer les données de différentes bases de données mongdb les serveurs.
Comme réponse de @Akshat, vous pouvez initialiser votre propre instance MongoInternals.RemoteCollectionDriver
, À travers laquelle Mongo.Collection
Peut être créé.
Mais voici quelque chose de plus à parler. Étant contraire à la réponse @Akshat, je trouve que le support Oplog est toujours disponible dans de telles circonstances.
Lors de l'initialisation du MongoInternals.RemoteCollectionDriver
Personnalisé, NE PAS oublier de spécifier l'URL Oplog:
var driver = new MongoInternals.RemoteCollectionDriver(
"mongodb://localhost:27017/db",
{
oplogUrl: "mongodb://localhost:27017/local"
});
var collection = new Mongo.Collection("Coll", {_driver: driver});
Comme décrit ci-dessus, il est assez simple d'activer le support Oplog. Si vous voulez savoir ce qui s'est passé sous ces deux lignes de codes, vous pouvez continuer à lire le reste de l'article.
Dans le constructeur de RemoteCollectionDriver
, un MongoConnection
sous-jacent sera créé:
MongoInternals.RemoteCollectionDriver = function (
mongo_url, options) {
var self = this;
self.mongo = new MongoConnection(mongo_url, options);
};
La partie délicate est la suivante: si MongoConnection
est créé avec oplogUrl
fourni, un OplogHandle
sera initialisé et commencera à suivre l'Oplog ( code source ):
if (options.oplogUrl && ! Package['disable-oplog']) {
self._oplogHandle = new OplogHandle(options.oplogUrl, self.db.databaseName);
self._docFetcher = new DocFetcher(self);
}
Comme cela blog l'a décrit: Meteor.publish
Appelle en interne Cursor.observeChanges
Pour créer une instance ObserveHandle
, qui suit automatiquement toutes les futures modifications survenues dans la base de données.
Il existe actuellement deux types de pilotes d'observation: l'héritage PollingObserveDriver
qui utilise une stratégie d'interrogation et de différenciation, et le OplogObseveDriver
, qui utilise efficacement Oplog-tailing pour surveiller les changements de données. Pour décider lequel appliquer, observeChanges
suit la procédure suivante ( code source ):
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
});
Afin de rendre canUseOplog
vrai, plusieurs conditions doivent être remplies. Un strict minimum est: l'instance sous-jacente MongoConnection
doit avoir un OplogHandle
valide. C'est la raison exacte pour laquelle nous devons spécifier oplogUrl
lors de la création MongoConnection