Как удалить элемент массива в 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

Смотрите Леонид Бесчастный ответ за правильный ответ.