web-dev-qa-db-fra.com

Utilisation de plusieurs bases de données Mongodb avec Meteor.js

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
37
Athena Wisdom

Mise à jour

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

<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

Ancienne réponse

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:

Une option - Utilisez une application Meteor distincte

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

Une autre option - connexion mongodb personnalisée

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();
   });
});
57
Akshat

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

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

Sous la capuche

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

24
Zephyre