【问题标题】:How to access meteor collection through the database如何通过数据库访问流星集合
【发布时间】:2015-12-24 07:03:34
【问题描述】:

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

【问题讨论】:

  • IIRC,在执行 new Mongo.Collection('db_name') 时,您实际上是在 MongoDB 中创建了一个名为 'db_name' 的集合,因此可能简单地共享名称就足够了(您可以通过复制粘贴来完成,或者如果您愿意要真正干净,请使用配置文件)。不过对此并不完全确定。

标签: meteor microservices


【解决方案1】:

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

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

又快又脏

这个解决方案并不复杂 - 只需将集合定义从一个应用程序复制到下一个应用程序:

A/lib/collections.js

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

B/lib/collections.js

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

这适用于您只需要集合名称的情况。


更多工作但可维护

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

这有点复杂,因为您需要创建一个 pacakge,但对于您的集合有 model 或其他需要在应用程序之间共享的额外代码的情况更好。此外,您还将获得创建包的好处,例如测试依赖管理等。

【讨论】:

  • 谢谢,这是我的假设,但只是想确定一下。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    或者您可以使用 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 从“管理服务器”中提取数据。这个集合只存在于内存中——在 mongo 中没有创建任何东西。您可以在服务器或客户端上执行此操作。绝对不是大型数据集的最佳选择。通过出版物限制数据传输。

    【讨论】:

      猜你喜欢
      • 2017-03-14
      • 1970-01-01
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      • 2016-04-27
      相关资源
      最近更新 更多