在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 

更新

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

 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应用程序都绑定到一个数据库。

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

一个选项 – 使用一个单独的meteor应用程序

在您的其他meteor应用程序(例如在同一台机器上的6000端口运行)。 您仍然可以有react native,但是您需要代理插入,通过方法调用删除和更新

服务器:

 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 native,您不能使用new Meteor.Collectiontypes集合。

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

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

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

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

作为@Akshat的答案,您可以初始化您自己的MongoInternals.RemoteCollectionDriver实例,通过它可以创buildMongo.Collection

但是这里有更多要谈的内容。 与@Akshat的回答相反,我发现在这种情况下Oplog支持仍然可用。

在初始化自定义MongoInternals.RemoteCollectionDriver不要忘记指定Oplog url:

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

在引擎盖下

如上所述,激活Oplog支持相当简单。 如果你想知道这两行代码下面发生了什么,你可以继续阅读其余的post。

RemoteCollectionDriver的构造函数中,将创build一个基础的MongoConnection

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

棘手的部分是:如果使用提供的OplogHandle创buildoplogUrl ,则将初始化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来创build一个ObserveHandle实例,它会自动跟踪数据库中发生的任何未来更改。

目前有两种观察者驱动程序:使用轮询和差异策略的传统PollingObserveDriver和使用Oplog-tailing来有效监控数据更改的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 。 这是创buildMongoConnection需要指定oplogUrl的确切原因