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