MongoDB: проектируйте только поля определенного типа

#mongodb #types #projection

#mongodb #типы #проекция

Вопрос:

Есть ли способ в MongoDB спроецировать все поля документа, которые имеют определенный тип?

Например, если у меня есть следующий документ:

 {
  _id: 5dde4c55c6c36b3bb4f5ad30,
  name: "Peter",
  age: 45,
  division: "marketing"
}
  

Я хотел бы сказать: возвращайте только поля типа string . Таким образом, я бы в итоге получил:

 {
  _id: 5dde4c55c6c36b3bb4f5ad30,
  name: "Peter",
  division: "marketing"
}
  

Ответ №1:

Вы можете использовать $type для проверки типа поля,

  • $reduce введите $$ROOT объект в виде массива, используя $objectToArray
  • проверьте условие, если тип значения поля string , затем сопоставьте с initialValue и верните
  • возвращаемым значением будет массив, нам нужно преобразовать его в массив с помощью $arrayToObject
  • $replaceWith заменит root на новый возвращаемый объект
 db.collection.aggregate([
  {
    $replaceWith: {
      $arrayToObject: {
        $reduce: {
          input: { $objectToArray: "$$ROOT" },
          initialValue: [],
          in: {
            $concatArrays: [
              "$$value",
              {
                $cond: [
                  { $eq: [{ $type: "$$this.v" }, "string"] },
                  ["$$this"],
                  []
                ]
              }
            ]
          }
        }
      }
    }
  }
])
  

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