Mongoose聚合获得组模型中的成员总数

时间:2016-03-08 02:37:33

标签: node.js mongodb mongoose mongodb-query aggregation-framework

我有一个这样的模型:

var field = {
    createdAt: {type: Date, default: Date.now()},
    updatedAt: {type: Date, default: Date.now()},
    pic : {type: String, default: 'http://lorempixel.com/400/400/abstract/', writable: true},
    thumb : {type: String, default: 'http://lorempixel.com/100/100/abstract/', writable: true},

    name: {type: String},
    description: {type: String},
    isPublic: {type: Boolean, default: true},
    members: [{type: Schema.Types.ObjectId, ref: 'Member'}],
}

我使用以下代码获取会员字段中Member ID的总数。

Group.aggregate([
    {$match: {_id:req.params.group_id}},
    {$group: {
        _id: '$members',
        count: {$sum: 1}
    }}
], function (err, count) {
    res.send(count);
});

但它返回并清空数组[]如何获得正确的计数?

感谢。

1 个答案:

答案 0 :(得分:0)

Mongoose没有" autocast"到OjectId或聚合管道中的任何其他模式类型。因此,您的操作不会返回任何内容

此外,这不是计算数组成员的方法。

最好使用$size选项来计算每个文档的数组成员:

Group.aggregate([
    { "$match": { _id: ObjectId(req.params.group_id) }},
    { "$group": {
        "_id": null,
        "count": { "$sum": { "$size": "$members" } }
    }}
], function (err, count) {
    res.send(count);
});

$group _id用于相应的汇总,或null用于此处集合中的所有项目。

如果你想要每个不同成员的数量"那么你将在文档中使用$unwind来处理:

Group.aggregate([
    { "$match": { _id: ObjectId(req.params.group_id) }},
    { "$unwind": "$members" },
    { "$group": {
        "_id": "$members",
        "count": { "$sum": 1 }
    }}
], function (err, count) {
    res.send(count);
});