- Оглавление
- Модификаторы обновления массивов
- Что это такое?
- Где/когда использовать?
- Что такое операторы?
- Синтаксис
- Оператор $push
- Что это такое?
- Синтаксис
- Оператор $pop
- Что это такое?
- Синтаксис
- Оператор $pull
- Что это такое?
- Синтаксис
- Оператор $addToSet
- Что это такое?
- Синтаксис
- Фильтры на массивах
- Что такое массивы?
- Синтаксис
- Полезные ссылки
Оглавление
- Обновление модификаторов в массивах
- Оператор
$push
- Оператор
$pop
- Оператор
$pull
- Оператор
$addToSet
- Фильтры на массивах
- Полезные ссылки
Модификаторы обновления массивов
Что это такое?
Update Modifiers in Arrays — это свободный перевод Update Operator Modifiers, которые представляют собой не что иное, как операторы, позволяющие модифицировать поведение обновлений во внутренних массивах Документов, позволяя, например, сортировать их.
Где/когда использовать?
Как видно из его определения выше, эти операторы напрямую взаимодействуют с массивами, поэтому мы должны использовать их только во взаимодействиях, где поля имеют этот тип.
Помните, что эти операторы, помимо того, что они ограничены полями типа массив, могут быть использованы только в операциях обновления.
Что такое операторы?
Согласно официальной документации, существует четыре модификатора, которые будут рассмотрены ниже.
Это: $each
; $position
; $slice
и $sort
.
Синтаксис
Несмотря на схожесть, каждый модификатор оператора обновления имеет свои особенности в синтаксисе, поэтому мы объясним их по отдельности.
$each
-
Функция: позволяет вставить несколько значений в поле типа массив. (работает только с операторами
$push
и$addToSet
) -
Синтаксис: должен быть объявлен после изменяемого поля и получает массив со значениями для вставки.
{ <operador de atualização>: <campo>: { $each: [<valor 1>, <valor 2>, <valor 3>] } }
{ $push: tasks: { $each: ["study", "go to the gym", "read"] } }
назад к началу
$position
-
Функция: позволяет вставить одно или несколько значений в определенную позицию массива (работает только с оператором
$push
). -
Синтаксис: необходимо предварительно использовать
$each
, после чего объявить$position
и сказать, с какой позиции будут вставляться новые значения.
{ $push: <campo>: { $each: [<valor 1>, <valor 2>, <valor 3>], $position: <index> } }
{ $push: tasks: { $each: ["study", "go to the gym", "read"], $position: 2 } }
назад к началу
$slice
-
Функция: ограничивает вставку новых значений. (работает только с оператором
$push
) -
Синтаксис: предварительно необходимо использовать
$each
, после чего мы объявляем$slice
и определяем, какое максимальное количество значений нужно добавить.
{ $push: <campo>: { $each: [<valor 1>, <valor 2>, <valor 3>], $slice: <index> } }
{ $push: tasks: { $each: ["study", "go to the gym", "read"], $slice: 2 } }
# irá inserir somente o "study" e o "go to the gym"
назад к началу
$sort
-
Функция: сортирует все значения, содержащиеся в массиве, а также те, которые будут добавлены (работает только с оператором
$push
) -
Синтаксис: необходимо предварительно использовать
$each
, после чего объявить$sort
и определить, по какому полю будет производиться сортировка, а также тип сортировки (по возрастанию или по убыванию).
{ $push: <campo>: { $each: [<valor 1>, <valor 2>], $sort: { <campo>: <tipo de ordenação> } } }
{ $push: products: { $each: [{ name: "doll", qty: 5 }, { name: "lego", qty: 2 }], $sort: { qty: 1 } } }
# no caso de não ser um objeto basta definir o tipo de ordenação diretamente => $sort: 1
назад к началу
Оператор $push
Что это такое?
Это оператор, который работает непосредственно с полями типа массив, позволяя добавлять новые значения без необходимости воссоздавать поле с нуля.
Синтаксис
Существует два способа использования оператора $push
, мы можем добавить только один элемент в конец массива, или добавить несколько элементов сразу, плюс мы можем изменить другое поведение, например, автоматическую сортировку.
В первом случае нам просто нужно вызвать $push
, объявить добавляемое поле и, наконец, определить добавляемый элемент.
Для остальных случаев необходимо использовать оператор $each
, который не только позволяет вставлять несколько значений, но и открывает возможность изменять большее количество поведений.
{ $push: { <campo>: <novo item> } }
{ $push: { <campo>: { $each: [<novos itens>], <outras configurações> } } }
{ $push: { products: { name: "computer", price: 2499.99 } } }
{ $push: { products: $each: [{ name: "computer", price: 2499.99 }, { name: "mouse", price: 499.99 }] } }
назад к началу
Оператор $pop
Что это такое?
Это оператор удаления, он может удалять первый или последний элемент массива.
Синтаксис
Чтобы удалить первый или последний элемент массива, просто вызовите метод $pop
, затем установите поле, содержащее массив, который нужно удалить, и, наконец, скажите, какой элемент нужно удалить (первый или последний).
{ $pop: { <campo>: <item a ser excluído> } }
{ $pop: { products: 1 } }
# 1 => exclui o último
# -1 => exclui o primeiro
назад к началу
Оператор $pull
Что это такое?
Это оператор, который позволяет удалять элементы в поле массива через условия, так что все элементы, которые соответствуют заданным условиям, удаляются.
Синтаксис
На первом этапе мы вызываем $pull
, затем определяем поле, которое будет подвержено удалению, и, наконец, указываем условия, которые должны быть выполнены, чтобы элемент был удален.
{ $pull: { <campo>: <query de deleção> } } # query é equivalente a "conjunto de condições"
{ $pull: { products: { price: { $gt: 400.00 } } } }
назад к началу
Оператор $addToSet
Что это такое?
Этот оператор работает аналогично $$push
, но помимо добавления новых значений в поле массива, $addToSet
также выполняет проверку, чтобы избежать дублирования значений, т.е. новое значение будет вставлено только в том случае, если оно уникально.
Стоит отметить, что данный процесс проверки дубликатов Документов является более «чувствительным к ошибкам», так как оператор будет считать дубликатами только те Документы, которые являются ТОЧНО РАВНЫМИ.
Синтаксис
Синтаксис оператора $push
также очень похож на синтаксис оператора $push
, что означает, что мы можем добавить один элемент или несколько элементов сразу, используя $each
, однако $addToSet
не принимает других опций, таких как $sort
.
Для добавления элемента мы просто вызываем оператор $addToSet
, затем указываем поле, которое нужно добавить, а затем определяем новое значение, которое нужно добавить.
Чтобы добавить несколько элементов, мы вызываем оператор $addToSet
, затем поле, которое нужно добавить, затем объявляем оператор $each
и, наконец, внутри массива определяем значения, которые нужно добавить.
{ $addToSet: { <campo>: <valor> } }
{ $addToSet: { <campo>: { $each: [<valor1>, <valor2>, <valor3>] } }
{ $addToSet: { email: gabriel@gabriel.com } }
{ $addToSet: { email: { $each: [gabriel@gabriel.com, daniela@daniela.com, fran@fran.com] } }
Примечание: «Если внутри массива, который мы добавляем, есть дублирующее значение, MongoDB выполнит действие без возникновения ошибок, но дублирующее значение не будет добавлено, сохранится только существующее значение».
назад к началу
Фильтры на массивах
Что такое массивы?
Это способы, с помощью которых мы можем динамически выбирать одно значение в массиве, проводя параллель с JS, это было бы эквивалентно HOF .find()
.
Синтаксис
Синтаксис этих фильтров, хотя и прост, но имеет свою особенность, это связано с тем, что он работает аналогично интерполяции mysql2 с помощью node.
Мы используем фильтры массива внутри операций обновления, через оператор $[<идентификатор>]
мы определяем общее имя, которое будет использоваться в качестве ссылки в интерполяции. Теперь, чтобы действительно определить значение, которое будет извлечено, мы используем опцию arrayFilters
, передавая все ссылки, которые мы создали ранее, и присваивая им значение.
{ <operação de att>: { <campo>.$[<referência>]: <novo valor> } },
{ arrayFilters: [{ <referência>: <valor a ser buscado> }] }
{ $set: { tasks.$[t].title: "study Node" } },
{ arrayFilters: [{ t.title: "study React" }] }
# o item com o "title" study React vai ter seu valor trocado para study Node
# Por se tratar de um recurso mais complexo, irei exemplificar com o método de atualização completo
# A função continua sendo a mesma, trocar "study React" por "study Node"
db.user_tasks.updateOne(
{ _id: 1 },
{
$set: { tasks.$[T].title: "study Node" }
},
{ arrayFilters: [{ T.title: "study React" }] }
)
назад к началу
Полезные ссылки
- Операторы обновления
- Обновление модификаторов
- Оператор
$[<идентификатор>]
- Оператор
$(update)
- Оператор
$[]
- Операторы запросов
- Простое обновление
назад к началу