こんにちは、
ObjectIdの配列からObjectIdを削除するにはどうすればよいですか?
私のモデル:
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 }
});
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));
});
});
ご返信ありがとうございます。
スプライスは使用しないでください。
me.friends.remove(uid);
me.save(callback);
その機能は美しいです!
次のように複数のドキュメントに対してこれを行う方法はありますか?
User.update({
friends: uid
}, {
'$pull': {
friends: uid
}
})
これと同じ質問に対する答えを探しています(上記)。 複数のドキュメントに対してこれをどのように行いますか?
@jhicknerは$pullAll
試してください。 http://docs.mongodb.org/manual/reference/operator/update/pullAll/
素晴らしい
@bnoguchiこんにちは、私はこれが古いスレッドであることを知っていますが、それはグーグルの最初の投稿です(そして私はここで解決策を見つけました)。
ただし、完全を期すために簡単な質問です。 どちらの使用法が推奨されますか:
me.friend.remove(uid);
me.save(callback);
または:
me.friends.pull(uid);
me.save(callback);
また、(要するに、 push()のより良い代替手段より正しい方法はありますか?
me.friend.push(uid);
me.save(callback);
ありがとう。
Re:最初の質問、個人的な好みまでは関係ありません
Re:2番目の質問、どのようにすればいいですか?
として-より効率的/より高速。
また、.pop(...)は配列を空にするときに問題が発生する可能性があることに気付き、me.save(callback)関数を呼び出した後に「cannotsave undefined」フィールドをスローしますが、remove()は正常に機能します。
いいえ、 push()
は、 save()
を使用しながらできるだけ速くする必要があります。 me.update({}, { $push: { friend: uid } }).then()
実行することもできます。これは、ミドルウェアや検証などをバイパスすることでわずかに高速になりますが、全体的なレイテンシーはそれほど改善されません。
Re: pop()
問題、スタックトレースとこの問題を再現するスクリプトを使用して、別の問題を開くことができますか?
最も参考になるコメント
スプライスは使用しないでください。