如何在流星应用环境中执行原生mongo方法?

Ale*_*ler 5 mongodb meteor

Meteor只支持mongo集合上的几个方法,如find,findOne,insert,update,upsert,remove,allow,deny 我的问题是,我如何执行所有其他方法?我想在服务器端使用聚合,如下所示:

db.eshops.aggregate([
  {
    $unwind: '$unpairedCategories'
  }, {
    $group: {
      _id: '$_id',
      'sum': {
        $sum: 1
      }
    }
  }, {
    $group: {
      _id: null,
      total_sum: {
        '$sum': '$sum'
      }
    }
  }
]);
Run Code Online (Sandbox Code Playgroud)

我应该将节点j的mongodb驱动程序与流星分开包含吗?或者运行所有其他mongo收集方法的流星方法是什么?

Bil*_*net 3

Meteor 的七个原则之一是数据库无处不在,即您应该能够在客户端和服务器端执行所有允许的操作(假设存在一些差异,例如allow deny客户端规则)。我想这就是为什么你不能拥有所有 mongo 方法的原因:它们在 minimongo(你的 mongo 集合的客户端版本)上不可行。

但是,如果您准备放弃反应性,则可以创建一个管道来处理aggregate命令,方法是将其添加到服务器启动代码中(代码取自此处):

wrapAsync = (Meteor.wrapAsync)? Meteor.wrapAsync : Meteor._wrapAsync;
Mongo.Collection.prototype.aggregate = function(pipelines) {
  var coll;
  if (this.rawCollection) {
    // >= Meteor 1.0.4
    coll = this.rawCollection();
  } else {
    // < Meteor 1.0.4
    coll = this._getCollection();
  }
  return wrapAsync(coll.aggregate.bind(coll))(pipelines);
Run Code Online (Sandbox Code Playgroud)

如果您想保持反应性,您有两种可能的替代方案/解决方法。

  1. 使用 集合钩子创建额外的字段。您基本上将计算字段包含在集合中。这是一个可扩展的解决方案,不需要给服务器添加额外的负载
  2. 您可以使用该cursor.Observe()功能,并混合使用巧妙的过滤和自定义 JS 方法(例如 sum),以获得与该aggregate方法所需的类似结果。请注意,您保持反应性,但每个服务器(如果您计划扩展多个服务器)都需要Observe()集合。检查此示例:https ://stackoverflow.com/a/30813050/3793161