【问题标题】:Return only a specific element in nested array with all properties仅返回具有所有属性的嵌套数组中的特定元素
【发布时间】:2021-07-16 12:41:24
【问题描述】:

我有以下文档结构(它是一个小型 LMS):

[
  {
    "name": "course1",
    "code": "C1",
    "levels": [
      {
        "levelname": "level01",
        "order": 1,
        "modules": [
          {
            "modulename": "title module 01",
            "code": "MC1_01",
            "order": 1,
            "title": "module title 01"
          },
          {
            "modulename": "title module 02",
            "code": "MC1_02",
            "order": 2,
            "title": "module title 02"
          }
        ]
      },
      {
        "levelname": "level02",
        "modules": [
          {
            "modulename": "title module 11",
            "code": "MC1_11",
            "order": 1,
            "title": "module title 01"
          },
          {
            "modulename": "title module 12",
            "code": "MC1_12",
            "order": 2,
            "title": "module title 02"
          }
        ]
      }
    ]
  },
  {
    "name": "course2",
    "code": "C2",
    "levels": [
      {
        "levelname": "level01",
        "order": 1,
        "modules": [
          {
            "modulename": "title module 01",
            "code": "MC2_01",
            "order": 1,
            "title": "module title 01"
          },
          {
            "modulename": "title module 02",
            "code": "MC2_02",
            "order": 2,
            "title": "module title 02"
          }
        ]
      },
      {
        "levelname": "level02",
        "modules": [
          {
            "modulename": "title module 10",
            "code": "MC2_10",
            "order": 1,
            "title": "module title 01"
          },
          {
            "modulename": "title module 11",
            "code": "MC2_11",
            "order": 2,
            "title": "module title 02"
          }
        ]
      }
    ]
  }
]

简而言之,我有一个包含所有课程的文档,一个课程由多个级别组成,每个级别都有许多模块:COURSE > LEVELS > MODULES

(这里有一个现成的游乐场:https://mongoplayground.net/p/Yo3OJQEQxf5

知道代码或_id,我必须提取一个单一的模式,但我还必须保持文档的结构不变,还要保持父文档的属性。 我的预期输出是(当我查找代码为 MC1_02 的模块时):

{
    "name": "course1",
    "code": "C1",
    "levels": [
        {
            "levelname": "level01",
            "order": 1,
            "modules": [
                {
                    "modulename": "title module 02",
                    "code": "MC1_02",
                    "order": 2,
                    "title": "module title 02"
                }
            ]
        }
    ]
}

我正在尝试几次,并且已经尝试使用这些答案中突出显示的解决方案:

Mongo db Query to filter nested array of objects in document
MongoDB nested array search using $map
$filter upto 3 nested level in mongodb

我确切地知道如何使用 $unwind 和 $group 来做到这一点,但对我来说这不是最好的解决方案,我更喜欢使用 $map 和 $filter。 同时,我不能使用 $project 或任何其他聚合运算符来强制我逐个枚举所有属性,因为在任何级别都有大量不同的属性,我无法列出它们,我只是需要保留所有。

万分感谢那些帮助我的人:)

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:
    • $match 匹配 code 条件
    • $map 迭代 levels 数组的循环
    • $filter 迭代 modules 数组的循环并过滤具有 code: "MC1_02"modules
    • $mergeObjects 将当前对象与更新的 modules 字段合并
    • $filter 以上结果如果modules 不为空[]
    db.collection.aggregate([
      { $match: { "levels.modules.code": "MC1_02" } },
      {
        $addFields: {
          levels: {
            $filter: {
              input: {
                $map: {
                  input: "$levels",
                  in: {
                    $mergeObjects: [
                      "$$this",
                      {
                        modules: {
                          $filter: {
                            input: "$$this.modules",
                            cond: { $eq: ["$$this.code", "MC1_02"] }
                          }
                        }
                      }
                    ]
                  }
                }
              },
              cond: { $ne: ["$$this.modules", []] }
            }
          }
        }
      }
    ])
    

    Playground

    【讨论】:

      猜你喜欢
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多