Як видалити елемент масиву в mongodb?


129

Ось структура масиву

contact: {
    phone: [
        {
            number: "+1786543589455",
            place: "New Jersey",
            createdAt: ""
        }
        {
            number: "+1986543589455",
            place: "Houston",
            createdAt: ""
        }

    ]
}

Тут я знаю тільки mongo id ( _id) та номер телефону ( +1786543589455), і мені потрібно видалити цілий відповідний елемент масиву з документа. тобто нульовий індексований елемент у масиві телефону узгоджується з номером телефону і потрібно видалити відповідний елемент масиву.

contact: {
    phone: [
        {
            number: "+1986543589455",
            place: "Houston",
            createdAt: ""
        }
    ]
}

Я спробував виконати наступний метод оновлення

collection.update(
    { _id: id, 'contact.phone': '+1786543589455' },
    { $unset: { 'contact.phone.$.number': '+1786543589455'} }
);

Але він видаляє number: +1786543589455з внутрішнього масиву об'єкт, а не нульовий індексований елемент у масиві телефону. Пробував pullтакож без успіху.

Як видалити елемент масиву в mongodb?

Відповіді:


237

Спробуйте виконати наступний запит:

collection.update(
  { _id: id },
  { $pull: { 'contact.phone': { number: '+1786543589455' } } }
);

Він знайде документ із заданим _idта видалить телефон +1786543589455зі свого contact.phoneмасиву.

Можна використовувати $unset для скидання значення масиву (встановлення його null), але не для його видалення повністю.


3
Дякую. Це добре працює. Я пробував { $pull: { 'contact.phone.$': { 'contact.phone.$.number': '+1786543589455' } } }і { $pull: { 'contact.phone': { 'contact.phone.$.number': '+1786543589455' } } }без успіху. Не розумієте тут роботи позиційних операторів?
Джастін Джон

1
Чи є передзвонок з цим?
Олівер Діксон

1
@iLoveUnicorns ви можете додати зворотній дзвінок як третій аргумент, або ви можете використовувати повернуту обіцянку.
Леонід Бещасний

@LeonidBeschastny Я спробував це. У моєму випадку у мене кілька документів з одним ключем. Я хочу $ тягнути всі ці документи, але поточний запит змінює лише 1 документ, а потім зупиняється. Які зміни мені потрібні?
Шубхам А.

1
@ShubhamA. за замовчуванням .update()оновлює один документ. Для оновлення кількох документів використовуйте { multi: true }опцію. Докладніше див. У db.collection.updateдокументах .
Леонід Бещасний

14

Цей нижче код видалить повний об'єктний елемент з масиву, де номер телефону "+1786543589455"

db.collection.update(
  { _id: id },
  { $pull: { 'contact': { number: '+1786543589455' } } }
);

4

У Мангусті: з документа :

Щоб видалити документ із масиву піддокументів, ми можемо передати об’єкт із відповідним _id.

contact.phone.pull({ _id: itemId }) // remove
contact.phone.pull(itemId); // this also works

Дивіться відповідь Леоніда Бещасного для правильної відповіді.


3

Ви можете просто використовувати $ pull, щоб видалити піддокумент. Оператор $ pull видаляє з існуючого масиву всі екземпляри значення або значень, які відповідають заданій умові.

Collection.update({
    _id: parentDocumentId
  }, {
    $pull: {
      subDocument: {
        _id: SubDocumentId
      }
    }
  });

Це знайде ваш батьківський документ проти заданого ідентифікатора, а потім видалить елемент із піддокумента, який відповідає заданим критеріям.

Детальніше про тягнути тут .


0

Якщо ви використовуєте API Mongoose і хочете витягнути суб / дочірній об’єкт: прочитайте цей документ. Не забувайте використовувати save (), коли ви закінчите редагування, інакше зміни не будуть збережені в базі даних.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.