在Meteor JS中使用MongoDB,如何正确使用Meteor Aggregate?
预期的结果是通过userId返回分组用户,并总结一个名为" progressState"的布尔字段。 (真/假)。
例如,文档可以包含:
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
}
}
]);
}
});
答案 0 :(得分:2)
如果您使用meteor hacks aggregate包在集合上实现.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
指的是输出中存在的字段,您的示例中的字段现在是{userId“值{1}}来自聚合的密钥,但如果需要,也可以按总计数“计数”。
该部分产生了错误,因为_id
是一个当前字段,而不是带有$sort
表示法的字段值。
但是当然要发布为客户端可访问的集合,您需要将实际的$
替换为预期的内容。所以随机id生成在这里工作,包含其他字段也是如此。
有关更多详细信息,以及仅适用于vanilla安装的“hacks”软件包的替代方案,我自己也有this answer个完整列表作为示例。