Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法


Posted in Python onSeptember 24, 2019

本文实例讲述了Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法。分享给大家供大家参考,具体如下:

前言:

想把QQ日志爬虫(Python)爬下来的日志保存到 MongoDB 里面。

但 insert 的时候报错:

E11000 duplicate key error collection: QQ.Blog index: _id_ dup key: { : "965464518_1301232446" }

后来知道错误的原因是:插入的数据和已有数据的 ID 重复了。

我想要的是:插入一篇日志,如果该日志(ID)已存在,则不执行(也不更新);如果不存在则插入。

百度中大部分的答案都是用更新,但如果 ID 存在的话我是想直接不执行的,没有更新已有数据的必要。

解决方案:

update里有个参数 ‘$setOnInsert' 可以实现”存在则不执行”的功能,可见 $setOnInsert 官方文档。

示例:

起始数据:

> db.Blog.insert({"_id":"123456", "blog_cont":"abcdef", "title":"《My Test》"})
> db.Blog.find()
{ "_id" : "123456", "blog_cont" : "abcdef", "title" : "《My Test》" }

加入相同 ID 的日志:

> db.Blog.update({"_id":"123456"}, {$setOnInsert:{"blog_cont":"abc123", "other":"hello world!"}}, {upsert:true})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
>
> db.Blog.find()
{ "_id" : "123456", "blog_cont" : "abcdef", "title" : "《My Test》" }

加入不同 ID 的日志:

> db.Blog.update({"_id":"123"}, {$setOnInsert:{"blog_cont":"abc123", "other":"hello world!"}}, {upsert:true})
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : "123" })
>
> db.Blog.find()
{ "_id" : "123456", "blog_cont" : "abcdef", "title" : "《My Test》"
{ "_id" : "123", "blog_cont" : "abc123", "other" : "hello world!" }

如果某些内容想更新的话(例如更新 title )可以用 ‘$set':

> db.Blog.update({"_id":"123456"}, {$setOnInsert:{"blog_cont":"abc123", "other":"hello world!"}, $set:{"title":"《New Title》"}}, {upsert:true})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
>
> db.Blog.find()
{ "_id" : "123456", "blog_cont" : "abcdef", "title" : "《New Title》
{ "_id" : "123", "blog_cont" : "abc123", "other" : "hello world!" }

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
CentOS中使用virtualenv搭建python3环境
Jun 08 Python
在Python的Django框架中更新数据库数据的方法
Jul 17 Python
从局部变量和全局变量开始全面解析Python中变量的作用域
Jun 16 Python
python实现简单多人聊天室
Dec 11 Python
Python3 SSH远程连接服务器的方法示例
Dec 29 Python
tensorflow实现测试时读取任意指定的check point的网络参数
Jan 21 Python
python中sort sorted reverse reversed函数的区别说明
May 11 Python
python能在浏览器能运行吗
Jun 17 Python
Python pysnmp使用方法及代码实例
Aug 24 Python
Python 的 sum() Pythonic 的求和方法详细
Oct 16 Python
Python中 range | np.arange | np.linspace三者的区别
Mar 22 Python
Python基本的内置数据类型及使用方法
Apr 13 Python
Python获取时间戳代码实例
Sep 24 #Python
Python django框架输入汉字,数字,字符生成二维码实现详解
Sep 24 #Python
分享一个pycharm专业版安装的永久使用方法
Sep 24 #Python
python实现的config文件读写功能示例
Sep 24 #Python
python使用socket实现的传输demo示例【基于TCP协议】
Sep 24 #Python
pymysql 开启调试模式的实现
Sep 24 #Python
django2.2安装错误最全的解决方案(小结)
Sep 24 #Python
You might like
关于PHP堆栈与列队的学习
2013/06/21 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(六)
2014/06/23 PHP
php身份证号码检查类实例
2015/06/18 PHP
PHP使用glob方法遍历文件夹下所有文件的实例
2018/10/17 PHP
JavaScript中的apply和call函数详解
2014/07/20 Javascript
jQuery获取节点和子节点文本的方法
2014/07/22 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
2014/10/07 Javascript
基于JavaScript实现定时跳转到指定页面
2016/01/01 Javascript
js实现动态创建的元素绑定事件
2016/07/19 Javascript
基于JavaScript实现全选、不选和反选效果
2017/02/15 Javascript
vue与TypeScript集成配置最简教程(推荐)
2017/10/17 Javascript
详解Vue基于 Nuxt.js 实现服务端渲染(SSR)
2018/04/05 Javascript
vue-router3.0版本中 router.push 不能刷新页面的问题
2018/05/10 Javascript
vue-cli项目中使用Mockjs详解
2018/05/14 Javascript
Bootstrap标签页(Tab)插件切换echarts不显示问题的解决
2018/07/13 Javascript
angularJS实现不同视图同步刷新详解
2018/10/09 Javascript
JS实现网页烟花动画效果
2020/03/10 Javascript
[01:10:48]完美世界DOTA2联赛PWL S2 GXR vs PXG 第一场 11.18
2020/11/18 DOTA
Python中使用logging模块代替print(logging简明指南)
2014/07/09 Python
Python中optparse模块使用浅析
2015/01/01 Python
python 连接sqlite及简单操作
2017/06/30 Python
Django中的文件的上传的几种方式
2018/07/23 Python
python实现简单名片管理系统
2018/11/30 Python
TensorFlow实现简单的CNN的方法
2019/07/18 Python
Django文件上传与下载(FileFlid)
2019/10/06 Python
python 实现目录复制的三种小结
2019/12/04 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
2020/06/11 Python
CSS3中颜色线性渐变实战
2015/07/18 HTML / CSS
致800米运动员广播稿
2014/02/16 职场文书
活动倡议书范文
2014/05/13 职场文书
建筑施工安全责任书
2014/07/24 职场文书
医德医风自我评价2015
2015/03/03 职场文书
同学聚会通知短信
2015/04/20 职场文书
goland设置颜色和字体的操作
2021/05/05 Golang
SQL Server中的游标介绍
2022/05/20 SQL Server
Vue3实现简易音乐播放器组件
2022/08/14 Vue.js