Позиционный оператор $ — один из наиболее сложных, но полезных операторов обновления массивов в MongoDB. Он обычно используется с другими операторами, такими как $set или $unset, и динамически указывает на определённый элемент массива. Позиция определяется результатами запроса, используемого в методе обновления. Фактически, $ представляет собой номер индекса элемента в массиве: 0, 1, 2 и так далее.
Использование оператора $
Оператор $ используется для обращения к элементам массива. .$ указывает на определённый элемент массива, а .$<поле> — на определённое поле вложенного документа, являющегося элементом массива.
Рассмотрим пример. Ищем документ с cartID: sweet2file, где массив cart содержит элемент item 2. Цель — обновить именно этот item 2. В операторе $set используется ссылка на элемент массива с помощью .$, присваивая элементу новое значение. Индекс item 2 в массиве cart определяет значение ., динамически изменяющееся в зависимости от позиции элемента.
Модификация элементов массива
Добавим элементы в массив cart документа с cartID: 561:
db.collection.update({cartID:561}, {$push:{cart:["item 1", "item 2", "item 3", "item 4"]}})
После выполнения команды массив cart будет содержать четыре элемента.
Изменим item 2:
db.collection.update({cartID: 561, cart: "item 2"}, {$set: {"cart.$": "updated item 2"}})
$ ссылается на индекс item 2 в массиве cart, изменяя его значение.
Удаление элементов массива
Для удаления item 3 используем $unset:
db.collection.update({cartID: 561, cart: "item 3"}, {$unset: {"cart.$": ""}})
$ указывает на позицию item 3, а $unset заменяет элемент на null. Размер массива остаётся неизменным.
Для полного удаления элемента используется $pull:
db.collection.update({cartID: 561}, {$pull: {cart: "item 3"}})
item 3 будет удалён из массива.
Работа со вложенными документами
Если массив содержит вложенные документы, для изменения конкретного документа используется комбинация оператора $ и оператора $elemMatch. Этот случай будет рассмотрен отдельно.