根据mongodb中的子文档字段分组

根据mongodb中的子文档字段分组,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,我在mongodb集合中存储了以下文档: { "_id" : ObjectId("5b56d4072eb1102f495c11ab"), "currentStage" : ObjectId("5b06999d889de3bd613ab79d"), "stagePermissions" : [ { "_id" : ObjectId("5b55a8cd8bb066994dc21314"), "status" : "A

我在mongodb集合中存储了以下文档:

{
    "_id" : ObjectId("5b56d4072eb1102f495c11ab"),
    "currentStage" : ObjectId("5b06999d889de3bd613ab79d"),
    "stagePermissions" : [
      {
            "_id" : ObjectId("5b55a8cd8bb066994dc21314"),
            "status" : "AWAITING_REVIEW",
            "stage" : ObjectId("5b06999d889de3bd613ab79d"),
      },
      {
            "_id" : ObjectId("5b55a8cd8bb066994dc21354"),
            "status" : "IN_PROGRESS",
            "stage" : ObjectId("5b06999d889de3bd613ac79d"),
      }
    ]

}
我想按
stagePermissions.status
获取文档计数,其中
stagePermissions.stage
等于
currentStage

Expected OutPut: 
[
  {_id: IN_PROGRESS, count: 1},
  {_id: AWAITING_REVIEW, count: 1}
]

您可以在3.6版本中使用以下聚合

只考虑至少有一个许可阶段与当前阶段权限匹配的文档。

展开阶段权限并筛选与当前阶段权限匹配的所有权限

阶段权限状态,后跟以计数权限

db.col.aggregate([
  {"$match":{"$expr":{"$in":["$currentStage","$stagePermissions.stage"]}}},
  {"$unwind":"$stagePermissions"},
  {"$match":{"$expr":{"$eq":["$currentStage","$stagePermissions.stage"]}}},
  {"$group":{"_id":"$stagePermissions.status","count":{"$sum":1}}}
])
3.4更新

输出阶段权限阶段与当前阶段相同的子文档

使用筛选器输出覆盖阶段权限数组

查询将返回所有参与者文档,其中的用户子文档的年龄与参与者的年龄相同

db.col.aggregate([
  {"$addFields":{"stagePermissions":{"$filter":{"input":"$stagePermissions","cond":{"$eq":["$$this.stage","$currentStage"]}}}}},
  {"$unwind":"$stagePermissions"},
  {"$group":{"_id":"$stagePermissions.status","count":{"$sum":1}}}
])

更新:

对于Mongo 3.4,您可以使用此聚合查询,因为只有在Mongo 3.6中才引入了
$expr

db.test.aggregate([
    { $unwind : "$stagePermissions"},
    {$project: {_id : 1, currentStage : 1, stagePermissions : 1, value : {$cmp: ['$currentStage','$stagePermissions.stage']}}},
    {$match: { value : {$eq:0}}},
    { $group :
        {
        _id : "$stagePermissions.status",
        count : {$sum : 1}
        }
    }
])
在这里,我们使用
$cmp
运算符首先获取比较值,然后使用
$match
运算符查找那些性质相同的文档

========================================================================= 输入文件:

{
        "_id" : ObjectId("5b56d4072eb1102f495c11ab"),
        "currentStage" : ObjectId("5b06999d889de3bd613ab79d"),
        "stagePermissions" : [
                {
                        "_id" : ObjectId("5b55a8cd8bb066994dc21314"),
                        "status" : "AWAITING_REVIEW",
                        "stage" : ObjectId("5b06999d889de3bd613ab79d")
                },
                {
                        "_id" : ObjectId("5b55a8cd8bb066994dc21354"),
                        "status" : "IN_PROGRESS",
                        "stage" : ObjectId("5b06999d889de3bd613ab79d")
                }
        ]
}
聚合查询:

db.test.aggregate([
    { $unwind : "$stagePermissions"},
    { $match : {$expr : {$eq : ["$currentStage", "$stagePermissions.stage" ]}}},
    { $group :
        {
        _id : "$stagePermissions.status",
        count : {$sum : 1}
        }
    }
])
输出:

{ "_id" : "IN_PROGRESS", "count" : 1 }
{ "_id" : "AWAITING_REVIEW", "count" : 1 }

您使用的是哪个版本的Mongo?版本3.4.10更新了答案。请尝试并让我知道!你能升级到3.6吗?如果你不能,我可以添加3.4投诉解决方案。不,我无法升级,如果你能提供解决方案,那就太棒了。谢谢