Mongoose: Remover da matriz[ObjectId]

Criado em 24 mai. 2011  ·  10Comentários  ·  Fonte: Automattic/mongoose

Olá,

Como posso remover um ObjectId de uma matriz de ObjectId?

Meu modelo :

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 }
});

A função para excluir o 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));
    });     
});                                     

Obrigado pela sua resposta.

Comentários muito úteis

Não use emenda.

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

Todos 10 comentários

Não use emenda.

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

Essa função é linda!

Existe uma maneira de fazer isso em vários documentos da seguinte forma?

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

Procurando uma resposta para esta mesma pergunta (acima). Como você faz isso para vários documentos?

Maravilhoso

@bnoguchi Oi, eu sei que este é um tópico antigo, mas é o primeiro post no google (e encontrei uma solução aqui).
Apenas uma pergunta rápida, no entanto, por uma questão de completude. Qual uso é preferido:

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

Ou:

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

Além disso, existe alguma maneira mais correta de inserir novos "amigos" em vez de (em resumo, melhor alternativa para push() ):

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

Obrigado.

Re: primeira pergunta, não importa, de acordo com a preferência pessoal

Re: 2ª pergunta, melhor em que sentido?

Como-in mais eficiente/mais rápido.
Além disso, notei que .pop(...) pode ter problemas ao esvaziar um array, lançando o campo "cannot save undefined" depois de chamar a função me.save(callback), enquanto remove() funciona bem - por isso estou perguntando.

Não, push() deve ser o mais rápido possível enquanto ainda estiver usando save() . Você também pode fazer me.update({}, { $push: { friend: uid } }).then() , que será um pouco mais rápido ignorando middleware, validação, etc., mas não melhorará muito a latência geral.

Re: os problemas pop() , você pode abrir um problema separado com um rastreamento de pilha e um script que reproduz esse problema, por favor?

Esta página foi útil?
0 / 5 - 0 avaliações