Come rimuovere l'elemento array in mongodb?


129

Ecco la struttura degli array

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

    ]
}

Qui conosco solo l'id di mongo ( _id) e il numero di telefono (+1786543589455 ) e devo rimuovere l'intero elemento dell'array corrispondente dal documento. vale a dire che l'elemento zero indicizzato nell'array telefonico è associato al numero di telefono e deve rimuovere l'elemento dell'array corrispondente.

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

Ho provato con il seguente metodo di aggiornamento

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

Ma rimuove number: +1786543589455 dall'oggetto array interno, non zero elemento indicizzato nell'array telefonico. Provato pullanche senza successo.

Come rimuovere l'elemento array in mongodb?

Risposte:


237

Prova la seguente query:

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

Troverà il documento con il dato _ide rimuoverà il telefono +1786543589455dal suo contact.phonearray.

È possibile utilizzare $unsetper annullare l'impostazione del valore nell'array (impostarlo su null), ma non per rimuoverlo completamente.


3
Grazie. Funziona bene. Ho provato con { $pull: { 'contact.phone.$': { 'contact.phone.$.number': '+1786543589455' } } }e { $pull: { 'contact.phone': { 'contact.phone.$.number': '+1786543589455' } } }senza successo. Non capisce il lavoro degli operatori posizionali qui?
Justin John,

1
C'è un richiamo con questo?
Oliver Dixon,

1
@iLoveUnicorns potresti aggiungere un callback come terzo argomento, oppure puoi usare la promessa restituita.
Leonid Beschastny,

@LeonidBeschastny Ho provato questo. Nel mio caso, ho più documenti con la stessa chiave. Voglio $ pull tutti questi documenti ma la query corrente cambia solo 1 documento e poi si interrompe. Di quali cambiamenti ho bisogno?
Shubham A.

1
@ShubhamA. per impostazione predefinita .update()aggiorna un singolo documento. Per aggiornare più documenti utilizzare l' { multi: true }opzione. Vedi i db.collection.updatedocumenti per i dettagli .
Leonid Beschastny,

14

Questo codice sottostante rimuoverà l'intero elemento dell'oggetto dall'array, dove il numero di telefono è "+1786543589455"

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

4

In Mongoose: dal documento :

Per rimuovere un documento da un array di documenti secondari, è possibile passare un oggetto con un _id corrispondente.

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

Vedi la risposta di Leonid Beschastny per la risposta corretta.


3

Puoi semplicemente usare $ pull per rimuovere un sotto-documento. L'operatore $ pull rimuove da un array esistente tutte le istanze di un valore o valori che corrispondono a una condizione specificata.

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

Questo troverà il tuo documento principale rispetto a un determinato ID e quindi rimuoverà l'elemento dal documento secondario che corrisponde ai criteri indicati.

Maggiori informazioni su pull qui .


0

Se si utilizza l'API Mongoose e si desidera estrarre un oggetto secondario / secondario: leggere questo documento. Non dimenticare di utilizzare save () al termine della modifica, altrimenti le modifiche non verranno salvate nel database.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.