在Meteor中使用MongoDB,如何正确地使用Meteor聚合?
预期的结果是通过userId返回分组用户,并总结一个名为"progressState“的布尔字段(true/false)。
例如,文档可以有:
user 001 - true
user 001 - false
user 001 - true
user 003 - false
user 005 - true但预期的结果将是:
user 001: 2 true
user 003: 0 true
user 005: 1 true
etc..我的尝试给出了以下错误:
"exception: FieldPath field names may not start with '$'."这是我的流星代码:
Meteor.publishComposite('completedLB', {
find: function() {
return userCompleted.aggregate([
{
$match: {
"progressState": "true"
}
},
{
$group: {
"_id": "$userId",
"count": {
"$sum": "$progressState"
}
}
},
{
$sort : {
"$progressState": -1
}
}
]);
}
});发布于 2015-08-05 05:25:32
如果您使用流星散在一起包在集合上实现一个.aggregate()命令,那么它只会返回一个数组作为响应。因此,您需要将其转化为一种已发表的集合:
Meteor.publish("completedLB,function() {
var self = this;
var results = userCompleted.aggregate([
{ "$match": { "progressState": true } },
{ "$group": {
"_id": "$userId",
"progressState": { "$first": "$progressState" },
"count": { "$sum": 1 }
}},
{ "$sort": { "_id": 1 } }
]);
_.each(results,function(result) {
self.added("client_collection_name",Random.id(), {
userId: result._id,
progressState: result.progressState,
count: result.count
});
});
self.ready();
});或者将false计数包含在建议的输出本身中:
{ "$group": {
"_id": "$userId",
"progressState": { "$first": true },
"count": { "$sum": { "$cond": ["$progressState", 1,0] }
}},
{ "$sort": { "_id": 1 } }作为要转换为数值的具有$cond值的管道。
在基本聚合中,您只是“合计”匹配的结果,当然,$sort引用了输出中的一个字段,在您的示例中,该字段将是来自聚合的_id键中的"userId“值,但如果需要,也可以按总计数进行”计数“。
该部分产生了错误,因为$sort是一个当前字段,而不是使用$表示法的字段值。
但是,当然,要作为客户端可访问的集合发布,您需要用预期的东西替换实际的_id。因此随机id生成在这里工作,包括其他字段也是如此。
要了解更多细节,也要了解与普通安装一起工作的"hacks“包的替代方案,还有一个单独的这个答案,它有一个完整的清单作为示例。
https://stackoverflow.com/questions/31823761
复制相似问题