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

tom*_*him 15 mongoose mongodb express

我正在使用MongoDB和Mongoose与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);
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

我的问题是:出于性能原因,有没有办法使用Mongoose来避免做两个请求?一个找到一个保存?

知道我不想更新推文,如果它已经存在.

谢谢

Joh*_*yHK 22

您可以使用updateupsert选项的调用来执行此操作:

TweetsModel.update(
    {tweet_id: tweet.tweet_id}, 
    {$setOnInsert: tweet}, 
    {upsert: true}, 
    function(err, numAffected) { .. }
);
Run Code Online (Sandbox Code Playgroud)

如果已存在包含该推文ID的文档,那么这是一个无操作.否则它将添加文档.

$setOnInsert需要v2.4 +的MongoDB.如果您的版本低于2.4,事情会变得更复杂.