Python MongoDB 插入資料,已存在則不執行,不存在則插入

九茶發表於2016-02-19

前言:

想把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!" }


希望對你有所幫助!



轉載請註明出處,謝謝!(原文連結:http://blog.csdn.net/Bone_ACE/article/details/50696477

相關文章