Извлекать только совпадающий объект из вложенного массива в mongodb - PullRequest
0 голосов
/ 12 июня 2018

В этом json мне нужен запрос на поиск, который находит все поля, где «status»: «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 голосов
/ 12 июня 2018

Вы можете попробовать ниже агрегации

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)
})

Дает вам следующий вывод (отметьте здесь )

[
  {
    "_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"
  }
]
...