Mongoose: не вставлять, если элемент уже сохранен

Я использую MongoDB и Mongoose с Express для хранения твитов, которые я получаю через API Twitter.

Я хочу избежать сохранения повторяющихся твитов. Я делаю что-то вроде этого:

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

Вы можете использовать вызов update с опцией upsert, чтобы сделать это:

TweetsModel.update(
    {tweet_id: tweet.tweet_id}, 
    {$setOnInsert: tweet}, 
    {upsert: true}, 
    function(err, numAffected) { .. }
);

Если документ уже существует с этим твитом id, то это не-op. В противном случае он добавит документ.

$setOnInsert требуется v2.4 + из MongoDB. Если ваша версия меньше 2,4, все усложняется.