Comment supprimer un élément de tableau dans mongodb?

130

Voici la structure du tableau

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

    ]
}

Ici, je ne connais que l'identifiant mongo ( _id) et le numéro de téléphone ( +1786543589455) et je dois supprimer tout cet élément de tableau correspondant du document. c'est-à-dire que zéro élément indexé dans le tableau de téléphone correspond au numéro de téléphone et doit supprimer l'élément de tableau correspondant.

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

J'ai essayé avec la méthode de mise à jour suivante

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

Mais il supprime number: +1786543589455de l'objet de tableau interne, pas zéro élément indexé dans le tableau de téléphone. Essayé avec pullégalement sans succès.

Comment supprimer l'élément de tableau dans mongodb?

Justin John
la source

Réponses:

238

Essayez la requête suivante:

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

Il trouvera le document avec le donné _idet supprimera le téléphone +1786543589455de son contact.phonetableau.

Vous pouvez utiliser $unsetpour annuler la valeur du tableau (la définir sur null), mais pas pour la supprimer complètement.

Léonid Beschastny
la source
3
Je vous remercie. Cela fonctionne bien. J'ai essayé avec { $pull: { 'contact.phone.$': { 'contact.phone.$.number': '+1786543589455' } } }et { $pull: { 'contact.phone': { 'contact.phone.$.number': '+1786543589455' } } }sans succès. Ne comprend pas le fonctionnement des opérateurs positionnels ici?
Justin John
1
Y a-t-il un rappel avec ça?
Oliver Dixon
1
@iLoveUnicorns, vous pouvez ajouter un rappel comme troisième argument, ou vous pouvez utiliser la promesse retournée.
Leonid Beschastny
@LeonidBeschastny J'ai essayé ça. Dans mon cas, j'ai plusieurs documents avec la même clé. Je veux $ extraire tous ces documents, mais la requête actuelle ne modifie qu'un seul document, puis s'arrête. De quels changements ai-je besoin?
Shubham A.
1
@ShubhamA. par défaut, .update()met à jour un seul document. Pour mettre à jour plusieurs documents, utilisez l' { multi: true }option. Voir la db.collection.updatedocumentation pour plus de détails .
Leonid Beschastny
14

Ce code ci-dessous supprimera l'élément d'objet complet du tableau, où le numéro de téléphone est '+1786543589455'

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

Dans Mongoose: du document :

Pour supprimer un document d'un tableau de sous-documents, nous pouvons passer un objet avec un _id correspondant.

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

Voir la réponse de Leonid Beschastny pour la bonne réponse.

Md Alamin
la source
3

Vous pouvez simplement utiliser $ pull pour supprimer un sous-document. L'opérateur $ pull supprime d'un tableau existant toutes les instances d'une valeur ou des valeurs qui correspondent à une condition spécifiée.

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

Cela trouvera votre document parent par rapport à l'ID donné, puis supprimera l'élément du sous-document qui correspond aux critères donnés.

En savoir plus sur pull ici .

Syeda Aimen Batool
la source
0

Si vous utilisez l'API Mongoose et que vous cherchez à extraire un objet sous / enfant: Lisez ce document N'oubliez pas d'utiliser save () lorsque vous avez terminé l'édition sinon les modifications ne seront pas enregistrées dans la base de données.

NonameLover
la source