仅从mongodb中的嵌套数组中检索匹配的对象

时间:2018-06-12 19:20:56

标签: mongodb mongodb-query aggregation-framework

在这个json中,我需要一个查找查询,找到所有字段,其中"状态":" Y",如果父字段具有" status" :" N",忽略子字段,否则找到子字段,其中" status":" Y"及其父字段

注意:子字段位于数组

[
  {
    "type": "Type 1",
    "status": "Y",
    "code": "1",
    "category": [
      {
        "type": "Cat 1",
        "status": "Y",
        "code": "1000",
        "subcategories": [
          {
            "type": "Sub 1",
            "status": "N",
            "code": "1001"
          },
          {
            "type": "Sub 2",
            "status": "N",
            "code": "1002"
          },
          {
            "type": "Sub 3",
            "status": "Y",
            "code": "1003"
          }
        ]
      },
      {
        "type": "Cat 2",
        "status": "N",
        "code": "2000",
        "subcategories": [
          {
            "type": "Sub 4",
            "status": "Y",
            "code": "2001"
          },
          {
            "type": "Sub 5",
            "status": "Y",
            "code": "2002"
          }
         ]
      }
    ]
  }
]

我的输出应该是这样的

[
  {
    "type": "Type 1",
    "status": "Y",
    "code": "1",
    "category": [
      {
        "type": "Cat 1",
        "status": "Y",
        "code": "1000",
        "subcategories": [
          {
            "type": "Sub 3",
            "status": "Y",
            "code": "1003"
          }
        ]
      }        ]
  }
]

提前致谢:)

1 个答案:

答案 0 :(得分:1)

您可以尝试以下聚合

db.collection.aggregate([
  { "$match": { "status": "Y" }},
  { "$unwind": "$category" },
  { "$match": { "category.status": "Y" } },
  { "$project": { "type": 1, "status": 1, "code": 1,
    "category.type": "$category.type",
    "category.status": "$category.status",
    "category.code": "$category.code",
    "category.subcategories": {
      "$filter": {
        "input": "$category.subcategories",
        "as": "subcategory",
        "cond": {
          "$eq": [
            "$$subcategory.status",
            "Y"
          ]
        }
      }
    }
  }},
  { "$group": {
    "_id": "$_id",
    "type": { "$first": "$type" },
    "status": { "$first": "$status" },
    "code": { "$first": "$code" },
    "category": { "$push": "$category" }
  }}
]).then((data) => {
  res.send(data)
})

为您提供以下输出(选中here

[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "category": [
      {
        "code": "1000",
        "status": "Y",
        "subcategories": [
          {
            "code": "1003",
            "status": "Y",
            "type": "Sub 3"
          }
        ],
        "type": "Cat 1"
      }
    ],
    "code": "1",
    "status": "Y",
    "type": "Type 1"
  }
]