更新 mongodb 文档,如果该文档存在,则创建

Posted

技术标签:

【中文标题】更新 mongodb 文档,如果该文档存在,则创建【英文标题】:Update mongodb document, if the document exists, else create 【发布时间】:2019-08-04 13:50:08 【问题描述】:

所以我正在尝试为我和我的朋友制作一个不和谐的机器人来跟踪 CS GO 10 人中的统计数据,并且我正在使用cheerio 从为我们提供统计数据的网站上进行网页抓取,然后将它们传递到 mongodb。 scraping 功能工作正常,但我试图弄清楚如何避免为每个用户创建重复的文档。如果我输入 *userid 857575 它会提取该用户的统计信息,并将其放入数据库中,但如果我多次调用它,它会在数据库中制作多个文档。我的问题是,如果不和谐中的消息作者与数据库中的用户名匹配,我将如何让 mongodb 更新文档?因此,如果用户名 bob 发送 *userid3939 并且 bob 已经存在于数据库中,请更新文档。如果 bob 不存在,则创建文档。下面的代码,感谢任何提示。

    module.exports.run = async (bot, message, args) => 
    
 
    console.log(args);
    var userUrl = 'https://popflash.site/user/' +args;
    console.log(userUrl);
    console.log(message.member.user.tag);
 
     
     rp(userUrl)
         .then(function (html) 
             const arr = [];
             var i = 0;
 
             $('.stat-container', html).each(function (key, value) 
                 arr[i++] = $(this).find(".stat").text();
 
             );
         
             

             const stats = new Stats(
                 _id: mongoose.Types.ObjectId(),
                 userName: message.member.user.tag,
                 userId: args,
                 HLTV: arr[0],
                 ADR: arr[1],
                 HS: arr[2],
                 W: arr[3],
                 L: arr[4],
                 T: arr[5],
                 win_percent: arr[6]
             );

            

             stats.save()
                 .then(function (result)                    
                    let botembed = new Discord.RichEmbed()
                        .setDescription(message.member.user + "'s 10 Man stats")
                        .setColor("#15f153")
                        .addField("stats", result)                        
                    
                         return message.channel.send(botembed);
                   
                    
                 )
                
         )
 


module.exports.help = 
    name: "userid"

【问题讨论】:

【参考方案1】:

通过db.collection.update,您可以指定upsert: true 选项以获得我认为您想要的行为。如果匹配,它将更新现有记录,否则将创建新记录。

【讨论】:

那会是什么样子?所需的功能是如果用户名与不和谐的用户名匹配,则将更新整个文档

以上是关于更新 mongodb 文档,如果该文档存在,则创建的主要内容,如果未能解决你的问题,请参考以下文章

《MongoDB入门教程》第20篇 文档更新之UPSERT

《MongoDB入门教程》第20篇 文档更新之UPSERT

Mongodb如何仅在不存在时插入(如果存在则不更新)?

MongoDB原子“findOrCreate”:findOne,如果不存在则插入,但不更新

查找 Mongodb 文档,如果它包含 mongoose 中的数组中的元素

用$ set和$ upsert更新mongodb