代码之家  ›  专栏  ›  技术社区  ›  Farhan Tahir

$filter和嵌套的$cond

  •  2
  • Farhan Tahir  · 技术社区  · 7 年前

    我收集了以下两个相关领域。

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

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

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

    换句话说,我想做的是跟随,因为我没有currentstage的id作为过滤器,我只有“admin”来过滤。

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

    预期产量:

    所有文件 现阶段 权限设置为“管理” stagePermissions 是的。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Farhan Tahir    7 年前

    您可以尝试以下聚合

     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