Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
本文实例讲述了PythonMongoDB插入数据时已存在则不执行,不存在则插入的解决方法。分享给大家供大家参考,具体如下:
前言:
想把QQ日志爬虫(Python)爬下来的日志保存到MongoDB里面。
但insert的时候报错:
E11000duplicatekeyerrorcollection:QQ.Blogindex:_id_dupkey:{:"965464518_1301232446"}
后来知道错误的原因是:插入的数据和已有数据的ID重复了。
我想要的是:插入一篇日志,如果该日志(ID)已存在,则不执行(也不更新);如果不存在则插入。
百度中大部分的答案都是用更新,但如果ID存在的话我是想直接不执行的,没有更新已有数据的必要。
解决方案:
update里有个参数‘$setOnInsert'可以实现”存在则不执行”的功能,可见$setOnInsert官方文档。
示例:
起始数据:
>db.Blog.insert({"_id":"123456","blog_cont":"abcdef","title":"《MyTest》"}) >db.Blog.find() {"_id":"123456","blog_cont":"abcdef","title":"《MyTest》"}
加入相同ID的日志:
>db.Blog.update({"_id":"123456"},{$setOnInsert:{"blog_cont":"abc123","other":"helloworld!"}},{upsert:true}) WriteResult({"nMatched":1,"nUpserted":0,"nModified":0}) > >db.Blog.find() {"_id":"123456","blog_cont":"abcdef","title":"《MyTest》"}
加入不同ID的日志:
>db.Blog.update({"_id":"123"},{$setOnInsert:{"blog_cont":"abc123","other":"helloworld!"}},{upsert:true}) WriteResult({"nMatched":0,"nUpserted":1,"nModified":0,"_id":"123"}) > >db.Blog.find() {"_id":"123456","blog_cont":"abcdef","title":"《MyTest》" {"_id":"123","blog_cont":"abc123","other":"helloworld!"}
如果某些内容想更新的话(例如更新title)可以用‘$set':
>db.Blog.update({"_id":"123456"},{$setOnInsert:{"blog_cont":"abc123","other":"helloworld!"},$set:{"title":"《NewTitle》"}},{upsert:true}) WriteResult({"nMatched":1,"nUpserted":0,"nModified":1}) > >db.Blog.find() {"_id":"123456","blog_cont":"abcdef","title":"《NewTitle》 {"_id":"123","blog_cont":"abc123","other":"helloworld!"}
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python常见数据库操作技巧汇总》、《Python数学运算技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。