Чтобы удалить рассматриваемый элемент, вы фактически собираетесь использовать обновление.Точнее, вы собираетесь выполнить обновление с помощью команды $pull
, которая удалит элемент из массива.
db.temp.update(
{ _id : "777" },
{$pull : {"someArray.0.someNestedArray" : {"name":"delete me"}}}
)
Здесь происходит немного "магии".Использование .0
означает, что мы знаем, что модифицируем 0-й элемент someArray
.Использование {"name":"delete me"}
означает, что мы знаем точные данные, которые планируем удалить.
Этот процесс работает просто отлично, если вы загружаете данные в клиент, а затем выполняете обновление.Этот процесс работает менее эффективно, если вы хотите выполнять «общие» запросы, которые выполняют эти операции.
Я думаю, что проще всего признать, что обновление массивов поддокументов обычно требует, чтобы в какой-то момент у вас был оригинал в памяти.
В ответ на первый комментарий ниже,Вы, вероятно, можете помочь в вашей ситуации, немного изменив структуру данных
"someObjects" : {
"name1": {
"someNestedArray" : [
{
"name" : "value"
},
{
"name" : "delete me"
}
]
}
}
Теперь вы можете сделать {$pull : { "someObjects.name1.someNestedArray" : ...
Вот проблема с вашей структурой.MongoDB не очень хорошо поддерживает манипулирование «подмассивами».Ваша структура имеет массив объектов, и эти объекты содержат массивы большего количества объектов.
Если у вас есть следующая структура, вам будет трудно использовать такие вещи, как $pull
:
array [
{ subarray : array [] },
{ subarray : array [] },
]
Если ваша структура выглядит так и , которую вы хотите обновить subarray
, у вас есть два варианта:
- Измените структуру, чтобы вы могли использовать
$pull
. - Не использовать
$pull
.Загрузите весь объект в клиент и используйте findAndModify
.