MongoDB — комплексные обновления


Оглавление

  • Обновление модификаторов в массивах
  • Оператор $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)
  • Оператор $[]
  • Операторы запросов
  • Простое обновление

назад к началу

Оцените статью
devanswers.ru
Добавить комментарий