javascript 在Meteor.js中使用多个Mongodb数据库

rxztt3cl  于 2022-12-28  发布在  Java
关注(0)|答案(3)|浏览(104)

2 Meteor.Collections是否可能从2个不同的mungdb数据库服务器检索数据?

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

qij5mzcb1#

答案是:可以设置多个Meteor. Collection从不同的mungdb数据库服务器检索数据。
正如@Akshat给出的答案,您可以初始化自己的MongoInternals.RemoteCollectionDriver示例,通过该示例可以创建Mongo.Collection
但这里还有一些要说的。与@Akshat的回答相反,我发现在这种情况下,Oplog支持仍然可用。
初始化自定义MongoInternals.RemoteCollectionDriver时,请勿忘记指定操作日志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);
};

棘手的是:如果使用提供的oplogUrl创建MongoConnection,则将初始化OplogHandle,并开始跟踪操作日志(源代码):

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

正如blog所述:Meteor.publish在内部调用Cursor.observeChanges以创建ObserveHandle示例,该示例自动跟踪数据库中将来发生的任何更改。
目前有两种观察者驱动程序:传统的PollingObserveDriver采用轮询和比较策略,OplogObseveDriver有效地使用操作日志跟踪来监视数据更改。为了决定应用哪一个,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。这正是我们需要在创建MongoConnection时指定oplogUrl的原因

cnh2zyt3

cnh2zyt32#

这实际上是可能的,使用一个内部接口:

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

i1icjdpr3#

更新

现在可以连接到远程/多个数据库:

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

其中<mongo_url>是一个mongodburl,例如mongodb://127.0.0.1:27017/meteor(带有数据库名称)
目前这种做法有一个缺点:无操作日志

旧答案

目前这是不可能的,因为每个流星应用程序都绑定到一个数据库。
有几种方法可以绕过这个问题,但它可能更复杂,它的价值:

一个选项-使用单独的Meteor应用程序

在你的另一个meteor应用程序中(例如在同一台机器上运行在6000端口),你仍然可以有React,但是你需要通过一个方法调用来代理插入、删除和更新
服务器:

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连接

这使用节点js mongodb本机驱动程序。
这是连接到数据库,就像您在任何其他节点js应用程序中所做的那样。

    • 没有**可用的React性,您不能使用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();
   });
});

相关问题