在mongoDB中插入或忽略多个文档

lov*_*esh 10 mongodb pymongo mongodb-query

我有一个集合,其中我的所有文档至少有这两个字段,比如说nameurl(其中url唯一的所以我在其上设置了一个唯一的索引).现在,如果我尝试插入带有副本的文档url,则会出错并停止程序.我不希望这种行为,但我需要这样的东西mysqlinsert or ignore,所以MongoDB的不应该重复插入文档url,并继续下一个文件.

是否有一些参数我可以传递给insert命令来实现这种行为?我通常使用pymongoas 做一批插入:

collection.insert(document_array)
Run Code Online (Sandbox Code Playgroud)

collection是一个集合,document_array是一个文档数组.

那么有什么方法可以实现insert or ignore多文档插入的功能吗?

Lef*_*ium 13

continue_on_error调用insert()时设置标志.注意PyMongo驱动程序2.1和服务器版本1.9.1是必需的:

continue_on_error(可选):如果为True,则数据库将不会停止处理批量插入(如果一个失败)(例如,由于ID重复).这使得批量插入的行为类似于一系列单个插入,除非在任何插入失败时设置lastError,而不仅仅是最后一个.如果发生多个错误,则只会通过error()报告最新的错误.


Wil*_*yne 11

试试这个:

try:
    coll.insert(
        doc_or_docs=doc_array,
        continue_on_error=True)
except pymongo.errors.DuplicateKeyError:
    pass
Run Code Online (Sandbox Code Playgroud)

如果插入中发生错误(例如尝试为唯一索引插入重复值),插入操作仍将引发异常,但它不会影响数组中的其他项.然后,您可以吞下错误,如上所示.


bar*_*aso 11

使用insert_many(),并设置ordered = False.

这将确保尝试所有写入操作,即使存在错误:http: //api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.insert_many


mpo*_*ien 0

为什么不将调用放入块.insert()try: ... except:并在插入失败时继续?

此外,您还可以使用update()带有upsert标志的常规调用。详细信息请参见:http://www.mongodb.org/display/DOCS/Updating#Updating-update%28%29