是否可以打包一个'真正的'mongodb库,仅在流星0.6中用于*服务器*端

时间:2013-04-05 12:04:04

标签: node.js mongodb meteor

据我所知,包含流星直到0.6的'mini-mongo'在聚合方面有一些限制,但希望这个故事在发布0.6时更容易。

我正在努力解决的问题是mini-mongo缺乏“聚合”。

我有一个像这样的记录的mongodb

db.account_records.findOne()
{
    "type" : "initial_balance",
    "amt" : 10,
    "account_id" : "95CPB9Be8NX3TGSpi",
    "_id" : "L9D7Agt4gW2Ht4NTA"
}

我想订阅(在客户端)查询如下的查询..

db.events.aggregate( [ { $group: {_id:"$account_id", balance: { $sum: "$amt"}}}]);

..给出(从终端“mongo meteor”风格使用“真正的”mongodb运行时)..

{
    "result" : [
        {
            "_id" : "Dn5Eouw8K4RrP9SGw",
            "balance" : 169.99922000000308
        },
        {
            "_id" : "Bawopno2QGs8guMWy",
            "balance" : 1
        },
        {
            "_id" : "95CPB9Be8NX3TGSpi",
            "balance" : 5
        }
    ],
    "ok" : 1
}

我似乎不太可能(或希望)执行复杂的聚合条款客户端,所以我可以看到我们迷你mongo的原因。但是我希望能够在新版本的meteor中安装标准的npm模块,创建一个我可以从'真正的'mongo发布并订阅mini-mongo的查询可能会更容易一些吗?

-

PS我已经发现了这一点,但所有那些双重下划线让我感到紧张我会尝试复杂的事情...... https://github.com/meteor/meteor/pull/644

2 个答案:

答案 0 :(得分:2)

您可以在服务器上使用该聚合推送。在Meteor之前0.6.0'引擎'版本npm模块集成仍然非常非官方,因此下划线,最后它可以正式使用,所以下面应该工作(从github pull修改为在0.6.0工作:{ {3}})

服务器端js

var path = Npm.require('path');
var MongoDB = Npm.require('mongodb');
var Future = Npm.require('fibers/future');

var Animals = new Meteor.Collection("animals");

Meteor.startup(function () {
  Animals.aggregate = function(pipeline) {
    var self = this;

    var future = new Future;
    self.find()._mongo.db.createCollection(self._name, function (err, collection) {
      if (err) {
        future.throw(err);
        return;
      }
      collection.aggregate(pipeline, function(err, result) {
        if (err) {
          future.throw(err);
          return;
        }
        future.ret([true, result]);
      });
    });
    var result = future.wait();
    if (!result[0])
      throw result[1];

    return result[1];
  };

});

Meteor.methods({
  myAggregationMethod: function() {
    return Animals.aggregate([ {$project: {dog:1, age:1}}, {$sort:{age:1}} ]);
  }
});

在您的客户端js 上,当您想要调用聚合时:

    Meteor.call('myAggregationMethod', function(err,result) {
      if (!err) {
          console.log(result)          
      } else {
        console.log(err);
      }
    });

添加mongodb软件包

1)在项目中创建一个名为packages的目录来存储你的包&在另一个名为mongodb的目录中,用于mongodb npm包

2)在名为package.js的mongodb中添加一个包含

的文件
Package.describe({
  summary: "Mongodb driver"
});

Npm.depends({'mongodb':"1.2.14"});

Package.on_use(function (api) {
  api.add_files('lib.js', 'server');
});

在名为lib.js的同一个mongodb目录中添加另一个文件,其中包含:

if(typeof(Npm) != "undefined") {
    MongoDB = Npm.require("mongodb");
}
else
{
    console.log("Please upgrade meteor to 0.6.0")
    MongoDB = __meteor_bootstrap__.require("mongodb");
}

最后删除

行 来自var MongoDB = Npm.require("mongodb")的{​​p> server.js因为我们在lib.js

进行了全球范围内的搜索

答案 1 :(得分:1)

修复Akshat对Meteor 0.9.0的回答,请使用:

self.find()._mongo._withDb(function(db) {
  return db.createCollection(self._name, function(err, collection) {
    if (err) {
      console.log(err);
      future.throw(err);
      return;
    }
    return collection.aggregate(pipeline, function(err, result) {
      if (err) {
        future.throw(err);
        return;
      }
      return future["return"]([true, result]);
    });
  });
});

此外,无需在标题中加入MongoDB = Npm.require("mongodb")