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.
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?
@jhickner tente $pullAll
. http://docs.mongodb.org/manual/reference/operator/update/pullAll/
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?
Comentários muito úteis
Não use emenda.