如何处理MongoDB中的DuplicateKeyError(pyMongo)?

时间:2017-06-09 16:12:34

标签: python mongodb pymongo database

有人可以告诉我如何处理MongoDB中的 DuplicateKeyError 吗?

我正在编写一个python脚本,我将几个文档从两个不同的集合移动到第三个集合中。由于具有几个相同的文档(具有相同的ObjectId),两个集合之间存在小的重叠。这导致以下结果:

  

DuplicateKeyError:E11000重复键错误集合:admin.collection_test index: id dup key:{:ObjectId('593a920b529e170d4b8fbf72')}

为了摆脱我使用的错误:

try:
    do something
except pymongo.errors.DuplicateKeyError:
    pass

我希望通过使用“try-except”将所有非交叉文档移动到第三个集合,但是一旦第一次重叠(集合中已经存在的文档)出现,脚本就会安静地停止运行。 非常感谢任何帮助!

3 个答案:

答案 0 :(得分:7)

如果您要对文档进行迭代,请尝试使用continue代替pass

for doc in documents:
    try:
        # insert into new collection
    except pymongo.errors.DuplicateKeyError:
        # skip document because it already exists in new collection
        continue

答案 1 :(得分:4)

for doc in documents:
    client.update_one({'_id': doc['_id']}, doc, upsert=True)

您可以将update_one与upsert = True一起使用。如果doc已存在,则会使用新文档更新doc,否则会创建新文档。

答案 2 :(得分:-1)

连接到数据库

connection = pymongo.MongoClient("192.168.2.202", 27017)

创建数据库

database = connection['my_database']

创建收藏

collection = database['my_collection']

插入文档中的文件

url="http://some/api/url/path/?format=json"
data = {
    '_id': url,
    'timestamp': datetime.datetime.now(),
    'data': {
        'XX': 1,
        'YY': 2,
        'ZZ':  3
    }
}

避免重复-如果不存在相同的ID,这将创建新文档

collection.update_one({'_id': url},  {"$set": data}, upsert=True)