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

yipeiwu_com7年前Python基础

本文实例讲述了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常见数据库操作技巧汇总》、《Python数学运算技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总

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

相关文章

对python中 math模块下 atan 和 atan2的区别详解

atan 和 atan2 都是反正切函数,返回的都是弧度 对于两点形成的直线,两点分别是 point(x1,y1) 和 point(x2,y2),其斜率对应角度的计算方法可以是: a...

Python模块文件结构代码详解

本文研究的主要是Python模块文件结构的相关内容,具体如下。 Python文件结构 文件结构(范例全文) #/usr/bin/env python "this is a...

python检测IP地址变化并触发事件

IoT PoC项目中需要展示视频采集源进行wifi切换后(表明视频采集源端发生了移动),接收端观看到的视频的流畅度,以及当接收端进行移动时,检测视频的流畅度,故需要一个模块周期性地探测本...

Python面向对象程序设计示例小结

本文实例讲述了Python面向对象程序设计。分享给大家供大家参考,具体如下: 示例1: #encoding:utf-8 '''example 1 class test: def...

python实现多进程通信实例分析

python实现多进程通信实例分析

操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在。那么进程之间怎么进行通信?他们之间的关联是怎样的?...