MongoDB — формат ответа

#mongodb

#mongodb

Вопрос:

У меня есть коллекция, которая выглядит примерно так:

 [
  {
    "_id": 1,
    "title": "dummy title",
    "settings": [
            {
                "type": "light",
                "status": "enabled"
            },
            {
                "type": "flare",
                "status": "disabled"
            },
            {
                "type": "toolbar",
                "status": "endbale"
            }
        ]
  }
]
  

Я хочу создать запрос для извлечения документа, но только с типами активных настроек в массиве, например, в приведенном выше случае результат должен быть:

 [
    {
      "_id": 1,
      "title": "dummy title",
      "enabled_settings": ["light", "toolbar"]
    }
  ]
  

Как я могу добиться чего-то подобного?

Ответ №1:

Вы можете использовать $reduce в проекционной части, $cond условие будет проверять, включен ли статус, затем объединять и в последнем возвращать vlaue,

 db.collection.find({},
{
  _id: 1,
  title: 1,
  settings: {
    $reduce: {
      input: "$settings",
      initialValue: [],
      in: {
        $concatArrays: [
          "$$value",
          {
            $cond: [
              { $eq: ["$$this.status", "enabled"] },
              ["$$this.type"],
              []
            ]
          }
        ]
      }
    }
  }
})
  

Игровая площадка