Mongoose:如果元素已经存储,请不要插入

时间:2013-12-01 12:37:05

标签: mongodb express mongoose

我正在使用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来避免做两个请求?一个找到一个保存?

知道我不想更新推文(如果它已经存在)。

谢谢

1 个答案:

答案 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,事情会变得更复杂。