108 votes

Dans mongoDb, comment supprimer un élément de tableau par son index ?

Dans l'exemple suivant, supposons que le document se trouve dans le répertoire db.people collection.

Comment supprimer le 3ème élément du intérêts par son indice ?

{
  "_id" : ObjectId("4d1cb5de451600000000497a"),           
  "name" : "dannie",  
  "interests" : [  
    "guitar",  
    "programming",           
    "gadgets",  
    "reading"  
  ]   
}

C'est ma solution actuelle :

var interests = db.people.findOne({"name":"dannie"}).interests;  
interests.splice(2,1)  
db.people.update({"name":"dannie"}, {"$set" : {"interests" : interests}});

Y a-t-il un moyen plus direct ?

0 votes

2voto

Climax Points 63

Je recommanderais d'utiliser un champ GUID (j'ai tendance à utiliser ObjectID), ou un champ à incrémentation automatique pour chaque sous-document du tableau.

Avec ce GUID, il est facile d'émettre un $pull et d'être sûr que le bon sera tiré. Il en va de même pour les autres opérations sur les tableaux.

1voto

Schwarz54 Points 694

Pour les personnes qui cherchent une réponse en utilisant mongoose avec nodejs. Voici comment je procède.

exports.deletePregunta = function (req, res) {
let codTest = req.params.tCodigo;
let indexPregunta = req.body.pregunta; // the index that come from frontend
let inPregunta = `tPreguntas.0.pregunta.${indexPregunta}`; // my field in my db
let inOpciones = `tPreguntas.0.opciones.${indexPregunta}`; // my other field in my db
let inTipo = `tPreguntas.0.tipo.${indexPregunta}`; // my  other field in my db

Test.findOneAndUpdate({ tCodigo: codTest },
    {
        '$unset': {
            [inPregunta]: 1, // put the field with [] 
            [inOpciones]: 1,
            [inTipo]: 1
        }
    }).then(()=>{ 
    Test.findOneAndUpdate({ tCodigo: codTest }, {
        '$pull': {
            'tPreguntas.0.pregunta': null,
            'tPreguntas.0.opciones': null,
            'tPreguntas.0.tipo': null
        }
    }).then(testModificado => {
        if (!testModificado) {
            res.status(404).send({ accion: 'deletePregunta', message: 'No se ha podido borrar esa pregunta ' });
        } else {
            res.status(200).send({ accion: 'deletePregunta', message: 'Pregunta borrada correctamente' });
        }
    })}).catch(err => { res.status(500).send({ accion: 'deletePregunta', message: 'error en la base de datos ' + err }); });
 }

Je peux réécrire cette réponse si je ne la comprends pas très bien, mais je pense qu'elle est correcte.

J'espère que cela vous aidera, j'ai perdu beaucoup de temps à résoudre ce problème.

1voto

Vikas Chauhan Points 709

C'est un peu tard mais cela peut être utile pour ceux qui utilisent des robots.

db.getCollection('people').update( 
  {"name":"dannie"}, 
  { $pull: 
   {
       interests: "guitar" // you can change value to 
   } 
  }, 
  { multi: true }
);

Si vous avez des valeurs comme -

property: [ 
    {
        "key" : "key1",
        "value" : "value 1"
    }, 
    {
        "key" : "key2",
        "value" : "value 2"
    }, 
    {
        "key" : "key3",
        "value" : "value 3"
    }
]

et vous voulez supprimer un enregistrement dont la clé est clé3 alors vous pouvez utiliser quelque chose -

 db.getCollection('people').update( 
  {"name":"dannie"}, 
  { $pull: 
   {
       property: { key: "key3"} // you can change value to 
   } 
  }, 
  { multi: true }
);

Il en va de même pour la propriété imbriquée.

0voto

David Connell Points 1

Je vous recommande de ne le faire que si c'est absolument nécessaire. J'ai mis en œuvre une solution dans ce fil de discussion, et j'ai constaté qu'elle créait un comportement inattendu en termes d'élément supprimé. Ma solution (en raison de contraintes de temps) était simplement de pousser un identifiant unique au tableau chaque fois que quelque chose était poussé vers la base de données.

0 votes

Et de quelle méthode s'agissait-il ? Pas la méthode GUID je présume ? Je peux imaginer que l'approche par l'index peut poser des problèmes si l'on ne fait pas très attention à son code, mais n'y a-t-il vraiment aucune raison de ne pas le faire correctement ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X