首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB聚合与MeteorJS中的分组问题

MongoDB聚合与MeteorJS中的分组问题
EN

Stack Overflow用户
提问于 2015-08-05 04:59:09
回答 1查看 582关注 0票数 2

在Meteor中使用MongoDB,如何正确地使用Meteor聚合?

预期的结果是通过userId返回分组用户,并总结一个名为"progressState“的布尔字段(true/false)。

例如,文档可以有:

代码语言:javascript
复制
user 001 - true
user 001 - false
user 001 - true
user 003 - false
user 005 - true

但预期的结果将是:

代码语言:javascript
复制
user 001: 2 true
user 003: 0 true
user 005: 1 true
etc..

我的尝试给出了以下错误:

代码语言:javascript
复制
"exception: FieldPath field names may not start with '$'."

这是我的流星代码:

代码语言:javascript
复制
Meteor.publishComposite('completedLB', {
    find: function() {
        return userCompleted.aggregate([
            {
                $match: {
                    "progressState": "true"
                }
            },
            {
                $group: {
                    "_id": "$userId",
                    "count": {
                        "$sum": "$progressState"
                    }
                }
            },
            {
                $sort : {
                    "$progressState": -1
                }
            }
        ]);
    }
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-05 05:25:32

如果您使用流星散在一起包在集合上实现一个.aggregate()命令,那么它只会返回一个数组作为响应。因此,您需要将其转化为一种已发表的集合:

代码语言:javascript
复制
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计数包含在建议的输出本身中:

代码语言:javascript
复制
        { "$group": {
            "_id": "$userId",
             "progressState": { "$first": true },
             "count": { "$sum": { "$cond": ["$progressState", 1,0] }
        }},
        { "$sort": { "_id": 1 } }

作为要转换为数值的具有$cond值的管道。

在基本聚合中,您只是“合计”匹配的结果,当然,$sort引用了输出中的一个字段,在您的示例中,该字段将是来自聚合的_id键中的"userId“值,但如果需要,也可以按总计数进行”计数“。

该部分产生了错误,因为$sort是一个当前字段,而不是使用$表示法的字段值。

但是,当然,要作为客户端可访问的集合发布,您需要用预期的东西替换实际的_id。因此随机id生成在这里工作,包括其他字段也是如此。

要了解更多细节,也要了解与普通安装一起工作的"hacks“包的替代方案,还有一个单独的这个答案,它有一个完整的清单作为示例。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31823761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档