在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.Collection
types集合。
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
的确切原因