我正在使用MongoDB和Mongoose with Express来存储我通过Twitter API检索的推文。
我想避免保存重复的推文。我正在做类似的事情:
TweetsModel.find({tweet_id: tweet.tweet_id}, function (err, tweets) {
if(tweets.length > 0){
cb('Tweet already exists',null);
} else{
tweet.save(function(err){
cb(err,user);
});
}
});
我的问题是:出于性能原因,有没有办法使用Mongoose来避免做两个请求?一个找到一个保存?
知道我不想更新推文(如果它已经存在)。
谢谢
答案 0 :(得分:21)
您可以使用update
调用upsert选项来执行此操作:
TweetsModel.update(
{tweet_id: tweet.tweet_id},
{$setOnInsert: tweet},
{upsert: true},
function(err, numAffected) { .. }
);
如果已存在包含该推文ID的文档,那么这是一个无操作。否则它将添加文档。
$setOnInsert
需要v2.4 +的MongoDB。如果你的版本低于2.4,事情会变得更复杂。