【问题标题】:Mongoose aggregate get total numbers of members in a group modelMongoose 聚合获取组模型中的成员总数
【发布时间】:2016-06-21 20:08:23
【问题描述】:

我有一个这样的模型:

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

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

谢谢。

【问题讨论】:

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


【解决方案1】:

Mongoose 不会“自动转换”到 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);
});

【讨论】:

  • { "$group": { "_id": null, "count": { "$sum": { "$size": "$members" } } }} 返回 { name: ' MongoError',消息:'异常:无效运算符\'$size\'',errmsg:'异常:无效运算符\'$size\'',代码:15999,ok:0 }
  • @TheGreenFox 你有哪个 MongoDB 服务器版本? $size 从 MongoDB 2.6 开始就支持了,所以它一定是旧的。使用$unwindnull$_id 进行处理,即使在$group _id 键中也是如此。
  • 哦,我使用的是 2.4.9,我应该升级。
  • @TheGreenFox 是的,你应该这样做。 $unwind 是 2.6 之前的唯一方法。请注意,如果您只对每个文档执行此操作而不是实际“分组”任何内容,那么 { "$project": { "count": { "$size": "$members" } } } 就可以正常工作(在支持的情况下)。我还建议在添加到数组时通过$inc 在文档中保留“计数”
  • 我认为$inc 方法会很好,因为每次我得到一个组时我总是需要计数。很好的建议 +1
猜你喜欢
  • 1970-01-01
  • 2016-01-31
  • 2019-02-11
  • 2017-11-09
  • 2019-02-07
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
相关资源
最近更新 更多