Node.js Mongoose aggregate获取组模型中的成员总数

Node.js Mongoose aggregate获取组模型中的成员总数,node.js,mongodb,mongoose,mongodb-query,aggregation-framework,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, defa

我有一个这样的模型:

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'}],
}
我使用下面的代码在members字段中获取
成员的ID总数

Group.aggregate([
    {$match: {_id:req.params.group_id}},
    {$group: {
        _id: '$members',
        count: {$sum: 1}
    }}
], function (err, count) {
    res.send(count);
});
但是它返回空数组
[]
如何获得正确的计数

谢谢

Mongoose不会“自动广播”到聚合管道中的
OjectId
或任何其他模式类型。因此,您的操作不返回任何内容,因为它不匹配任何内容

而且,这不是计算数组成员的方法

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

Group.aggregate([
{“$match”:{{u id:ObjectId(req.params.group_id)},
{“$组”:{
“_id”:空,
“计数”:{“$sum”:{“$size”:“$members”}
}}
],函数(错误,计数){
res.send(count);
});
$group
,使用
\u id
进行适当的汇总,或
null
此处用于集合中的所有项目

如果您想要“每个不同成员的计数”,那么您可以使用跨文档处理:

Group.aggregate([
{“$match”:{{u id:ObjectId(req.params.group_id)},
{“$unwind”:“$members”},
{“$组”:{
“_id”:“$members”,
“计数”:{“$sum”:1}
}}
],函数(错误,计数){
res.send(count);
});
Mongoose不会“自动广播”到聚合管道中的
OjectId
或任何其他模式类型。因此,您的操作不返回任何内容,因为它不匹配任何内容

而且,这不是计算数组成员的方法

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

Group.aggregate([
{“$match”:{{u id:ObjectId(req.params.group_id)},
{“$组”:{
“_id”:空,
“计数”:{“$sum”:{“$size”:“$members”}
}}
],函数(错误,计数){
res.send(count);
});
$group
,使用
\u id
进行适当的汇总,或
null
此处用于集合中的所有项目

如果您想要“每个不同成员的计数”,那么您可以使用跨文档处理:

Group.aggregate([
{“$match”:{{u id:ObjectId(req.params.group_id)},
{“$unwind”:“$members”},
{“$组”:{
“_id”:“$members”,
“计数”:{“$sum”:1}
}}
],函数(错误,计数){
res.send(count);
});

Mongoose不会在聚合管道中“自动广播”到
ObjectId
。你需要自己铸造它,否则你的
$match
什么都不匹配。以前有人问过,让我搜索重复项。的可能重复项也会打开,因此假设我得到了正在工作的
{$match}
,这会返回
成员的总数吗?谢谢。@BlakesSevenLengthy相关的Mongoose不会在聚合管道中“自动广播”到
ObjectId
。你需要自己铸造它,否则你的
$match
什么都不匹配。以前有人问过,让我搜索重复项。的可能重复项也会打开,因此假设我得到了正在工作的
{$match}
,这会返回
成员的总数吗?谢谢。@BlakesSevenLengthy相关的{“$group”:{“_id”:null,“count”:{“$sum”:{“$size”:“$members”}}}}}}}返回{name:'MongoError',消息:'exception:无效运算符\'$size\'',errmsg:'exception:无效运算符\'$size\'',代码:15999,ok:0}@TheGreenfox您有哪个MongoDB服务器版本<代码>$size
自MongoDB 2.6以来一直受支持,因此它必须是旧的。使用
$unwind
null
$\u id
处理变量,即使在
$group
\u id
键中也是如此。哦,我使用的是2.4.9,应该升级。@greenfoxx是的,应该升级<代码>$REWIND
是2.6版之前的唯一方法。请注意,只要
{“$project”:{“count”:{“$size”:“$members”}}
就可以了(在支持的情况下),如果您只对每个文档执行此操作,而不是实际“分组”任何内容。我还建议在添加到阵列时,通过在文档中保留“计数”。我认为,
$inc
方法会很好,因为每次我得到一个组时,我总是需要计数。伟大的建议+1{“$group”:{“\u id”:null,“count”:{“$sum”:{“$size”:“$members”}}}}}}}返回{name:'MongoError',message:'exception:invalid operator\'$size\'',errmsg:'exception:invalid operator\'$size\'',代码:15999,ok:0}@TheGreenFoxx您有哪个MongoDB服务器版本<代码>$size
自MongoDB 2.6以来一直受支持,因此它必须是旧的。使用
$unwind
null
$\u id
处理变量,即使在
$group
\u id
键中也是如此。哦,我使用的是2.4.9,应该升级。@greenfoxx是的,应该升级<代码>$REWIND是2.6版之前的唯一方法。请注意,只要
{“$project”:{“count”:{“$size”:“$members”}}
就可以了(在支持的情况下),如果您只对每个文档执行此操作,而不是实际“分组”任何内容。我还建议在添加到阵列时,通过在文档中保留“计数”。我认为,
$inc
方法会很好,因为每次我得到一个组时,我总是需要计数。好建议+1