MongoDB Aggregate&在MeteorJS中分组问题

时间:2015-08-05 04:59:10

标签: mongodb meteor mongodb-query aggregation-framework

在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
                }
            }
        ]);
    }
});

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个完整列表作为示例。