如何通过数据库访问meteorcollection

How to access meteor collection through the database

我想将我的应用程序的管理代码托管在共享同一数据库的完全不同的应用程序上。但是,这意味着我的 collections 至少在代码中是在我的主应用程序而不是我的管理应用程序的全局命名空间中定义的。我如何访问数据库中的 collections,而无需在流星 server/client 之间共享的文件中定义全局变量?作为参考,我使用这篇文章作为以这种方式设置我的管理工具的想法。 admin article

每个 应用程序 都有自己的代码,但会共享相同的 mongo 数据库。您需要为管理应用程序定义相同的集合(或子集甚至超集)。您可以在两个应用程序之间 rsync 某些目录,如果这也可以进行该过程,但是 Meteor 中没有任何东西可以为您执行此操作。

为了简化问题,假设您有:

  • 两个应用程序:AB
  • 一个共享collection:Posts
  • 一个 shared database 通过 MONGO_URL

快速而肮脏

此解决方案并不复杂 - 只需将 collection 定义从一个应用程序复制到下一个应用程序即可:

A/lib/collections.js

Posts = new Mongo.Collection('posts');

B/lib/collections.js

Posts = new Mongo.Collection('posts');

这在您只需要 collection 名称的情况下效果很好。


更多工作但可维护

为您的 Posts collection 创建共享 local package。在每个应用中:meteor add posts.

这有点复杂,因为您需要创建一个包,但如果您的 collection 有一个 model 或其他需要共享的额外代码,这会更好应用程序。此外,您将获得创建包的好处,例如测试依赖管理等。

或者您可以使用 DDP 在两个服务器之间共享数据:

var conn = DDP.connect('http://admin-server');

Tracker.autorun(function() {
  var status = conn.status();

  if(status.connection) {
    var messages = new Mongo.Collection('messages', {connection: conn});
    conn.subscribe('messages', function() { console.log('I haz messages'); });
  }
});

这将创建一个名为 messages 的本地集合,它通过 DDP 从 "admin server" 中提取数据。此集合仅存在于内存中 - mongo 中未创建任何内容。您可以在服务器或客户端上执行此操作。绝对不是大型数据集的最佳选择。限制与出版物的数据传输。