Mongoose: Supprimer du tableau[ObjectId]

Créé le 24 mai 2011  ·  10Commentaires  ·  Source: Automattic/mongoose

Bonjour,

Comment supprimer un ObjectId d'un tableau d'ObjectId ?

Mon modele :

var User = new Schema({
    title       : { type : String,  index: true },
    name        : String,
    friends     : [ObjectId],
    join_at     : {type:Date, default:Date.now },
    save_at     : {type:Date, default:Date.now }
});

La fonction de suppression de l'objectId : uid

User.findOne({'_id' : self.id}, function(err, me){
    for(var i=0; i<=me.friends.length; i++){
        if (String(me.friends[i])==String(uid)){
            me.friends.splice(i, 1);
            break;                          
        }
    }
    me.save(function(err,us){
        next(err,'kljlmjk'+JSON.stringify(me));
    });     
});                                     

Merci pour votre réponse.

Commentaire le plus utile

N'utilisez pas d'épissure.

me.friends.remove(uid);
me.save(callback);

Tous les 10 commentaires

N'utilisez pas d'épissure.

me.friends.remove(uid);
me.save(callback);

Cette fonction est magnifique !

Existe-t-il un moyen de le faire sur plusieurs documents comme suit ?

User.update({
    friends: uid
}, {
    '$pull': {
        friends: uid
    }
})

Vous cherchez une réponse à cette même question (ci-dessus). Comment faire pour plusieurs documents ?

formidable

@bnoguchi Salut, je sais que c'est un vieux fil, mais c'est le premier post sur google (et j'ai trouvé une solution ici).
Juste une petite question, cependant, par souci d'exhaustivité. Quelle utilisation est préférée :

me.friend.remove(uid);
me.save(callback);

Ou:

me.friends.pull(uid);
me.save(callback);

De plus, existe-t-il un moyen plus correct d'insérer de nouveaux "amis" au lieu de (en bref, une meilleure alternative pour push() ):

me.friend.push(uid);
me.save(callback);

Merci.

Re: première question, peu importe, selon vos préférences personnelles

Re : 2ème question, mieux dans quel sens ?

Au fur et à mesure plus efficace/plus rapide.
De plus, j'ai remarqué que .pop(...) peut avoir des problèmes lors du vidage d'un tableau, en lançant le champ "ne peut pas enregistrer undefined" après avoir appelé la fonction me.save(callback), tandis que remove() fonctionne correctement - d'où ma demande.

Non, push() devrait être aussi rapide que possible tout en utilisant save() . Vous pouvez également faire me.update({}, { $push: { friend: uid } }).then() , ce qui sera légèrement plus rapide en contournant le middleware, la validation, etc. mais cela n'améliorera pas trop la latence globale.

Re : les problèmes de pop() , pouvez-vous ouvrir un problème séparé avec une trace de pile et un script qui reproduit ce problème s'il vous plaît ?

Cette page vous a été utile?
0 / 5 - 0 notes