#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"],
[]
]
}
]
}
}
}
}
}
])