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

Ath*_*dom 37 javascript mongodb node.js meteor smartcollection

是否可以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
Run Code Online (Sandbox Code Playgroud)

Aks*_*hat 57

更新

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

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

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

目前有一个缺点:没有Oplog

老答案

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

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

一个选项 - 使用单独的Meteor App

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

服务器:

Cats = Meteor.Collection('cats')

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

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

您当前的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);
Run Code Online (Sandbox Code Playgroud)

另一种选择 - 自定义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();
   });
});
Run Code Online (Sandbox Code Playgroud)


Emi*_*ily 26

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

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


小智 24

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

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

但这里有更多值得讨论的内容.与@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});
Run Code Online (Sandbox Code Playgroud)

在引擎盖下

如上所述,激活Oplog支持非常简单.如果你想知道在这两行代码下面发生了什么,你可以继续阅读帖子的其余部分.

在构造函数中RemoteCollectionDriver,MongoConnection将创建一个底层:

MongoInternals.RemoteCollectionDriver = function (
  mongo_url, options) {
  var self = this;
  self.mongo = new MongoConnection(mongo_url, options);
}; 
Run Code Online (Sandbox Code Playgroud)

棘手的部分是:如果MongoConnection使用oplogUrl提供创建,OplogHandle将初始化,并开始尾随Oplog(源代码):

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

正如本博客所描述的:Meteor.publish内部调用Cursor.observeChanges创建ObserveHandle实例,该实例自动跟踪数据库中发生的任何未来更改.

目前有两种观察者驱动程序:遗留PollingObserveDriver系统采用poll-and-diff策略,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
});
Run Code Online (Sandbox Code Playgroud)

为了成canUseOplog真,应该满足几个要求.最小的一个是:底层MongoConnection实例应该有效OplogHandle.这就是我们oplogUrl在创建时需要指定的确切原因MongoConnection

  • 这需要标记为正确的答案!我已经标记了这篇文章,希望管理员或OP可以切换答案! (2认同)