Как удалить элемент массива в mongodb?
Вот структура массива
contact: {
phone: [
{
number: "+1786543589455",
place: "New Jersey",
createdAt: ""
}
{
number: "+1986543589455",
place: "Houston",
createdAt: ""
}
]
}
Здесь я знаю только идентификатор mongo (_id
) и номер телефона (+1786543589455
), и мне нужно удалить весь этот элемент массива из документа. i.e нулевой индексный элемент в телефонном массиве сопоставляется с номером телефона и должен удалить соответствующий элемент массива.
contact: {
phone: [
{
number: "+1986543589455",
place: "Houston",
createdAt: ""
}
]
}
Я попытался с помощью следующего метода обновления
collection.update(
{ _id: id, 'contact.phone': '+1786543589455' },
{ $unset: { 'contact.phone.$.number': '+1786543589455'} }
);
Но он удаляет number: +1786543589455
из внутреннего объекта массива, а не нулевой индексный элемент в телефонном массиве. Пробовал с помощью pull
также без успеха.
Как удалить элемент массива в mongodb?
Ответы
Ответ 1
Попробуйте выполнить следующий запрос:
collection.update(
{ _id: id },
{ $pull: { 'contact.phone': { number: '+1786543589455' } } }
);
Он найдет документ с данным _id
и удалит телефон +1786543589455
из массива contact.phone
.
Вы можете использовать $unset
для отмены значения в массиве (установите его на null
), но не полностью удалить его.
Ответ 2
Этот ниже код удалит полный элемент объекта из массива, где номер телефона "+1786543589455"
db.collection.update(
{ _id: id },
{ $pull: { 'contact': { number: '+1786543589455' } } }
);
Ответ 3
Вы можете просто использовать $ pull для удаления поддокумента. Оператор $ pull удаляет из существующего массива все экземпляры значения или значений, которые соответствуют указанному условию.
Collection.update({
_id: parentDocumentId
}, {
$pull: {
subDocument: {
_id: SubDocumentId
}
}
});
Это найдет ваш родительский документ против данного идентификатора, а затем удалит элемент из subDocument, который соответствует заданным критериям.
Подробнее читайте здесь.
Ответ 4
В мангусте: из документа:
Чтобы удалить документ из массива вложенных документов, мы можем передать объект с совпадающим _id.
contact.phone.pull({ _id: itemId }) // remove
contact.phone.pull(itemId); // this also works
Смотрите Леонид Бесчастный ответ за правильный ответ.