Как удалить элемент массива в mongodb?

130

Вот структура массива

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?

Джастин Джон
источник

Ответы:

238

Попробуйте следующий запрос:

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

В Mongoose: из документа :

Чтобы удалить документ из массива поддокументов, мы можем передать объект с совпадающим _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 (), когда закончите редактирование, иначе изменения не будут сохранены в базе данных.

NonameLover
источник