¿Cómo eliminar el elemento de matriz en mongodb?

129

Aquí está la estructura de la matriz

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

    ]
}

Aquí solo conozco la identificación de mongo ( _id) y el número de teléfono ( +1786543589455) y necesito eliminar todo el elemento de matriz correspondiente del documento. es decir, el elemento indexado cero en la matriz del teléfono coincide con el número de teléfono y necesita eliminar el elemento de la matriz correspondiente.

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

Intenté con el siguiente método de actualización

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

Pero elimina number: +1786543589455del objeto de matriz interna, no un elemento indexado a cero en la matriz del teléfono. Probado con pulltambién sin éxito.

¿Cómo eliminar el elemento de matriz en mongodb?

Justin John
fuente

Respuestas:

237

Pruebe la siguiente consulta:

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

Encontrará el documento con lo dado _idy eliminará el teléfono +1786543589455de su contact.phonematriz.

Puede usar $unsetpara desarmar el valor en la matriz (configurarlo en null), pero no para eliminarlo por completo.

Leonid Beschastny
fuente
3
Gracias. Funciona bien Lo intenté con { $pull: { 'contact.phone.$': { 'contact.phone.$.number': '+1786543589455' } } }y { $pull: { 'contact.phone': { 'contact.phone.$.number': '+1786543589455' } } }sin éxito. ¿No entiende el funcionamiento de los operadores posicionales aquí?
Justin John
1
¿Hay devolución de llamada con esto?
Oliver Dixon
1
@iLoveUnicorns puede agregar una devolución de llamada como tercer argumento, o puede usar la promesa devuelta.
Leonid Beschastny
@LeonidBeschastny Intenté esto. En mi caso, tengo varios documentos con la misma clave. Quiero $ extraer todos estos documentos, pero la consulta actual solo cambia 1 documento y luego se detiene. ¿Qué cambios necesito?
Shubham A.
1
@ShubhamA. por defecto .update()actualiza un solo documento. Para actualizar varios documentos, use la { multi: true }opción. Ver db.collection.updatedocumentos para más detalles .
Leonid Beschastny
14

El siguiente código eliminará el elemento objeto completo de la matriz, donde el número de teléfono es '+1786543589455'

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

En Mangosta: del documento :

Para eliminar un documento de una matriz de subdocumento, podemos pasar un objeto con un _id coincidente.

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

Ver la respuesta de Leonid Beschastny para la respuesta correcta.

MD Alamin
fuente
3

Simplemente puede usar $ pull para eliminar un subdocumento. El operador $ pull elimina de una matriz existente todas las instancias de un valor o valores que coinciden con una condición especificada.

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

Esto encontrará su documento padre contra la ID dada y luego eliminará el elemento de subDocument que coincide con los criterios dados.

Lea más sobre pull aquí .

Syeda Aimen Batool
fuente
0

Si usa la API de Mongoose y busca extraer un objeto secundario / secundario: lea este documento No olvide usar save () cuando termine de editar; de lo contrario, los cambios no se guardarán en la base de datos.

NonameLover
fuente