带有嵌套$ cond的$ filter

时间:2018-07-09 07:06:50

标签: mongodb mongoose aggregation-framework

我有一个集合,其中包含以下两个相关字段。

{
      currentStage: ObjectId("5b06999d889de3bd613ab79d"),
      stagePermissions: [
           {
            "stage" : ObjectId("5b06999d889de3bd613ab79d"),
            "_id" : ObjectId("5b3ca6ed676af0e70150a7b9"),
            "permissions" : [ 
                "admin"
            ]
        }, 
        {
            "stage" : ObjectId("587d33db87969c1b380fb903"),
            "_id" : ObjectId("5b3ca6ed676af0e70150a7b8"),
            "permissions" : [ 
                "admin"
            ]
        }, 
      ]
}

我需要查询的是获取对“ admin”具有当前阶段权限的文档。

所以我需要匹配"stagePermissions.permissions": "admin"。但是问题是stagePermissions具有所有阶段的权限。我只需要将currentStagestagePermissions.permissions匹配。

换句话说,我要执行的操作是因为我没有currentStage的ID作为过滤器,因此只能使用“ admin”进行过滤。

"stagePermissions.stage": "document's currentStage" AND "stagePermissions": "admin"

预期输出:

currentStage中将其stagePermissions权限设置为“ admin”的所有文档。

1 个答案:

答案 0 :(得分:1)

您可以尝试以下汇总

 db.collection.aggregate([
  {
    "$project": {
      "stagePermissions": {
        "$filter": {
          "input": "$stagePermissions",
          "as": "stagePermission",
          "cond": {
            "$and": [
              {
                "$eq": [
                  "$$stagePermission.stage",
                  "$currentStage"
                ]
              },
              {
                "$in": [
                  "admin",
                  "$$stagePermission.permissions"
                ]
              }
            ]
          }
        }
      },
      "currentStage": 1
    }
  },
  {
    "$match": {
      "stagePermissions": {
        "$ne": []
      }
    }
  }
])

尝试here