【问题标题】:Mongoose : don't insert if element already storedMongoose:如果元素已经存储,则不要插入
【发布时间】:2013-12-17 05:00:39
【问题描述】:

我正在使用 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 来避免执行两个请求?一发现一保存?

如果推文已经存在,我也不想更新它。

谢谢

【问题讨论】:

    标签: mongodb express mongoose


    【解决方案1】:

    您可以使用带有upsert 选项的update 调用来执行此操作:

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

    如果已存在具有该推文 ID 的文档,则这是无操作的。否则它将添加文档。

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

    【讨论】:

    • 我认为必须是$setOnInsert : tweet,否则文档的其余部分将无法保存。
    • 对于 MongoDB 11000-errors),因为 $set 会更新数据库中的现有文档(@tomahim 不想要)。
    • @robertklep 是的,在这种情况下会变得更加混乱。希望他是 2.4。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多