sourcetip

Meteor.js와 함께 여러 Mongodb 데이터베이스 사용

fileupload 2023. 6. 2. 21:17
반응형

Meteor.js와 함께 여러 Mongodb 데이터베이스 사용

2명 가능합니까?Meteor.Collections두 개의 다른 mongdb 데이터베이스 서버에서 데이터를 검색하고 있습니까?

Dogs = Meteor.Collection('dogs')        // mongodb://192.168.1.123:27017/dogs
Cats = Meteor.Collection('cats')        // mongodb://192.168.1.124:27017/cats

갱신하다

이제 원격/여러 데이터베이스에 연결할 수 있습니다.

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

어디에<mongo_url>는 다음과 같은 몽고드버럴입니다.mongodb://127.0.0.1:27017/meteor(데이터베이스 이름 포함)

현재로서는 단 한 가지 단점이 있습니다. Oplog가 없습니다.

오래된 대답

현재로서는 이것이 가능하지 않습니다.각 유성 앱은 하나의 데이터베이스에 바인딩됩니다.

이 문제를 해결할 수 있는 몇 가지 방법이 있지만 그 가치보다 더 복잡할 수 있습니다.

하나의 옵션 - 별도의 유성 앱 사용

다른 유성 앱(예: 동일한 시스템의 포트 6000에서 실행).반응성을 유지할 수 있지만 메소드 호출을 통해 삽입, 제거 및 업데이트를 프록시해야 합니다.

서버:

Cats = Meteor.Collection('cats')

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

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

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

다른 옵션 - 사용자 지정 mongodb 연결

노드 jsmongodb 네이티브 드라이버를 사용합니다.

이것은 마치 다른 노드 js 앱에서처럼 데이터베이스에 연결하는 것입니다.

사용 가능한 반응성이 없으므로 다음을 사용할 수 없습니다.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();
   });
});

정답은 YES입니다. 유성을 여러 개 설정할 수 있습니다.서로 다른 mongdb 데이터베이스 서버에서 데이터를 검색하는 컬렉션입니다.

@Akshat의 대답처럼, 당신은 당신 자신의 것을 초기화할 수 있습니다.MongoInternals.RemoteCollectionDriver예를 들어, 그것을 통해.Mongo.Collection생성할 수 있습니다.

하지만 여기에 더 이야기할 것이 있습니다.@Akshat 답변과 반대로, 저는 Oplog 지원이 그러한 상황에서도 여전히 가능하다는 것을 알게 되었습니다.

사용자 정의 초기화 시MongoInternals.RemoteCollectionDriverOplog URL을 지정하는 것을 잊지 마십시오.

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

후드 아래

위에서 설명한 것처럼 Oplog 지원을 활성화하는 것은 매우 간단합니다.만약 당신이 그 두 줄의 코드 아래에서 무슨 일이 일어났는지 알고 싶다면, 당신은 게시물의 나머지 부분을 계속 읽을 수 있습니다.

의 생성자에서RemoteCollectionDriver근저에 있는 사람MongoConnection생성됩니다.

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

까다로운 부분은 다음과 같습니다.MongoConnection으로 생성됨oplogUrl단,OplogHandle초기화되고 Oplog(소스 코드)를 따라가기 시작합니다.

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

블로그에서 설명한 바와 같이:Meteor.publish내부 전화Cursor.observeChanges를 생성하기 위해ObserveHandle인스턴스 - 데이터베이스에서 발생한 향후 변경 사항을 자동으로 추적합니다.

현재 두 가지 유형의 관찰자 드라이버가 있습니다. 레거시PollingObserveDriver여론조사와 디프 전략이 필요하고, 그리고.OplogObseveDriver데이터 변경을 모니터링하기 위해 Oplog-tailing을 효과적으로 사용합니다., 어떤것을적결위해기하정지할용,observeChanges는 다음 절차(소스 코드)를 따릅니다.

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

만기위는서해를 만들기 .canUseOplog사실, 몇 가지 요구 사항이 충족되어야 합니다.은 다음과 기초가 최한의같습니다과음다것은소.MongoConnection한 "" "" "" ""가 .OplogHandle이 바로 가 이이우명하정이다니유입확을 지정해야 입니다.oplogUrl을 생성하는 MongoConnection

이는 실제로 내부 인터페이스를 사용하여 가능합니다.

var d = new MongoInternals.RemoteCollectionDriver("<mongo url>");
C = new Mongo.Collection("<collection name>", { _driver: d });

언급URL : https://stackoverflow.com/questions/20535755/using-multiple-mongodb-databases-with-meteor-js

반응형