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, все усложняется.