【问题标题】:$filter with nested $cond带有嵌套 $cond 的 $filter
【发布时间】:2018-12-16 19:14:03
【问题描述】:

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

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

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

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

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

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

预期输出:

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

【问题讨论】:

  • 上述集合的输出应该是什么?
  • @AnthonyWinzlet 我刚刚更新了我的问题。
  • @AnthonyWinzlet 我需要所有“stagePermissions”,而不仅仅是一个匹配的,我也没有要过滤的 currentStage Id,我需要从正在处理的当前文档中访问它。
  • @AnthonyWinzlet Bascially 我正在尝试获取那些具有“管理员”权限的文档作为其当前阶段的权限。并且所有 stagePermissions 也都存储在同一个文档中。
  • 两者。 stagePermissions.stage === currentStage and stagePermissions.permissions === 'admin'

标签: mongodb mongoose aggregation-framework


【解决方案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

【讨论】:

  • @LondonRob 如果我们为模式建立良好的体系结构,那么 mongodb 正是最好的数据库......但是新手不能这样做并且去嵌套字段......而且现在使用 mongodb 很容易加入,所以现在用 mongodb 就好了
  • @LondonRob 实际上我正在开发一个现有项目,是的,它是在 mongodb 中设计的,但具有所有样式,例如基于 SQL 的数据库模式。
猜你喜欢
  • 2023-04-04
  • 2020-01-01
  • 2016-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 2023-03-10
  • 1970-01-01
相关资源
最近更新 更多