Korzystanie z wielu baz danych Mongodb z Meteorem.js

Czy 2 Meteor.Collections może pobierać dane z 2 różnych serwerów baz danych mongdb?

Dogs = Meteor.Collection('dogs')        // mongodb://192.168.1.123:27017/dogs
Cats = Meteor.Collection('cats')        // mongodb://192.168.1.124:27017/cats
Author: Athena Wisdom, 2013-12-12

3 answers

Update

Możliwe jest teraz łączenie się ze zdalnymi / wieloma bazami danych:

var database = new MongoInternals.RemoteCollectionDriver("<mongo url>");
MyCollection = new Mongo.Collection("collection_name", { _driver: database });

Gdzie <mongo_url> jest adresem URL mongodb, takim jak mongodb://127.0.0.1:27017/meteor (z nazwą bazy danych)

Jest w tej chwili jedna wada: No Oplog

Stara Odpowiedź

W tej chwili nie jest to możliwe. Każda aplikacja meteor jest powiązana z jedną bazą danych.

Jest kilka sposobów na obejście tego, ale może to być bardziej skomplikowane, że jego wartość:

Jedna opcja-Użyj osobna aplikacja Meteor

W innej aplikacji meteor (przykład działa na porcie 6000 na tej samej maszynie). Nadal możesz mieć reaktywność, ale musisz wstawiać, usuwać i aktualizować proxy za pomocą wywołania metody

Serwer:

Cats = Meteor.Collection('cats')

Meteor.publish("cats", function() {
    return Cats.find();
});

Meteor.methods('updateCat, function(id, changes) {
    Cats.update({_id: id}, {$set:changes});
});

Twoja aktualna aplikacja 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);

Inna opcja-niestandardowe połączenie mongodb

Używa natywnego sterownika node JS mongodb.

To łączenie się z bazą danych, tak jak w każdym innym węźle js app.

Nie mabrak reaktywności i nie można używać zbiorów typu 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();
   });
});
 59
Author: Akshat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Odpowiedź brzmi tak : możliwe jest ustawienie wielu meteorów.Kolekcje do pobierania danych z różnych serwerów baz danych mongdb.

Jako odpowiedź od @Akshat, możesz zainicjować własną instancję MongoInternals.RemoteCollectionDriver, za pomocą której można utworzyć Mongo.Collection s.

Ale tu jest coś więcej do omówienia. Będąc w sprzeczności z odpowiedzią @Akshat, uważam, że wsparcie Oplog jest nadal dostępne w takich okolicznościach.

Podczas inicjalizacji zwyczaju MongoInternals.RemoteCollectionDriver, DO Nie zapomnij podać Url Oploga:

var driver = new MongoInternals.RemoteCollectionDriver(
    "mongodb://localhost:27017/db", 
    {
      oplogUrl: "mongodb://localhost:27017/local"
    });
var collection = new Mongo.Collection("Coll", {_driver: driver});

Pod maską

jak opisano powyżej, aktywacja obsługi Oplog jest dość prosta. Jeśli chcesz wiedzieć, co się stało pod tymi dwoma liniami kodów, możesz kontynuować czytanie reszty postu.

W konstruktorze RemoteCollectionDriver zostanie utworzony bazowy MongoConnection:

MongoInternals.RemoteCollectionDriver = function (
  mongo_url, options) {
  var self = this;
  self.mongo = new MongoConnection(mongo_url, options);
}; 

Trudne jest to: Jeśli MongoConnection zostanie utworzony z oplogUrl pod warunkiem, OplogHandle zostanie zainicjowany i zacznie ogon kod źródłowy Oplog ():

if (options.oplogUrl && ! Package['disable-oplog']) {  
  self._oplogHandle = new OplogHandle(options.oplogUrl, self.db.databaseName);
  self._docFetcher = new DocFetcher(self);
}

Jak ten blog opisał: Meteor.publish wewnętrzne wywołania Cursor.observeChanges w celu utworzenia instancji ObserveHandle, która automatycznie śledzi przyszłe zmiany w bazie danych.

Obecnie istnieją dwa rodzaje sterowników obserwatorów: legacy PollingObserveDriver, który wykorzystuje strategię ankiety i różnicowania, oraz OplogObseveDriver, które skutecznie wykorzystują śledzenie Oplog do monitorowania zmian danych. Aby zdecydować, który z nich zastosować, observeChanges stosuje następującą procedurę (kod źródłowy):
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
});

Aby uczynić canUseOplog prawdą, należy spełnić kilka wymagań. Podstawowa instancja MongoConnection powinna mieć poprawną OplogHandle. Jest to dokładny powód, dla którego musimy określić oplogUrl podczas tworzenia MongoConnection

 27
Author: Haizi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-18 04:20:26

Jest to możliwe dzięki wewnętrznemu interfejsowi:

var d = new MongoInternals.RemoteCollectionDriver("<mongo url>");
C = new Mongo.Collection("<collection name>", { _driver: d });
 26
Author: Emily,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-15 21:58:54