据我所知,包含流星直到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
答案 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")
。