为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

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


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

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


查看完整描述

3 回答

?
拉丁的传说

更新资料

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


var database = new MongoInternals.RemoteCollectionDriver("<mongo url>");

MyCollection = new Mongo.Collection("collection_name", { _driver: database });

<mongo_url>mongodb url 在哪里,例如mongodb://127.0.0.1:27017/meteor(带有数据库名称)


目前,这样做有一个缺点:没有Oplog


旧答案

目前这是不可能的。每个流星应用程序都绑定到一个数据库。


有几种方法可以解决此问题,但其价值可能会更复杂:


一种选择-使用单独的Meteor应用

在其他流星应用程序中(例如在同一台计算机上的端口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连接

这使用了节点js mongodb本机驱动程序。


就像在其他任何节点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();

   });

});


查看完整回答
反对 回复 2019-10-16
?
慕的地6264312

使用内部接口实际上是可行的:


var d = new MongoInternals.RemoteCollectionDriver("<mongo url>");

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


查看完整回答
反对 回复 2019-10-16
?
慕工程0101907

答案是肯定的:可以设置多个Meteor.Collections从不同的mongdb数据库服务器中检索数据。


作为@Akshat的答案,您可以初始化自己的MongoInternals.RemoteCollectionDriver实例,通过该实例Mongo.Collection可以创建s。


但是这里还有更多要讨论的东西。与@Akshat答案相反,我发现在这种情况下仍然可以使用Oplog支持。


初始化自定义时MongoInternals.RemoteCollectionDriver,请不要忘记指定Oplog网址:


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尾部监视数据更改的。要决定采用哪种方法,请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


查看完整回答
反对 回复 2019-10-16

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信