За да изтриете въпросния елемент, всъщност ще използвате актуализация. По-конкретно ще направите актуализация с $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
.