首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用猫鼬过滤mongoDB中的嵌套数组

用猫鼬过滤mongoDB中的嵌套数组
EN

Stack Overflow用户
提问于 2022-04-24 18:05:28
回答 2查看 160关注 0票数 2

我需要过滤MongoDB中的多级嵌套数组。模式如下,

代码语言:javascript
复制
    {
      "_id": "1234",
      "array1": [
        {
          "id": "a11",
          "array2": [
            {
              "id": "a21",
              "array3": [
                {
                  "id": "a31",
                  "status": "done"
                },
                {
                  "id": "a32",
                  "status": "pending"
                }
              ]
            }
          ]
        }
      ]
    }

所需的输出必须使用条件array3和条件status=done筛选。实现相同目标的最佳方法是哪一种?

EN

回答 2

Stack Overflow用户

发布于 2022-04-24 18:13:14

使用$map迭代array1array2,使用$filter过滤array3。最后,将array3与空数组进行文档匹配比较。

代码语言:javascript
复制
db.collection.aggregate([
  {
    "$addFields": {
      "array1": {
        "$map": {
          "input": "$array1",
          "as": "a1",
          "in": {
            id: "$$a1.id",
            array2: {
              "$map": {
                "input": "$$a1.array2",
                "as": "a2",
                "in": {
                  id: "$$a2.id",
                  array3: {
                    "$filter": {
                      "input": "$$a2.array3",
                      "as": "a3",
                      "cond": {
                        $eq: [
                          "$$a3.status",
                          "done"
                        ]
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  {
    $match: {
      "array1.array2.array3": {
        $ne: []
      }
    }
  }
])

这是供您参考的蒙戈游乐场

票数 1
EN

Stack Overflow用户

发布于 2022-04-24 19:55:26

查询

  • 几乎与@ray查询相同
  • $mergeObjects允许我们不手工编写字段(如果是mongoDB5+,也可以使用$setField)(如果您有10个字段代替id,这将在不更改查询的情况下工作)

花花果

代码语言:javascript
复制
aggregate(
[{"$set": 
   {"array1": 
     {"$map": 
       {"input": "$array1",
        "as": "a1",
        "in": 
         {"$mergeObjects": 
           ["$$a1",
             {"array2": 
               {"$map": 
                 {"input": "$$a1.array2",
                  "as": "a2",
                  "in": 
                   {"$mergeObjects": 
                     ["$$a2",
                      {"array3": 
                       {"$filter": 
                        {"input": "$$a2.array3",
                         "as": "a3",
                         "cond": {"$eq": ["$$a3.status", "done"]}}}}]}}}}]}}}}}])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71991025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档