MongoDB:不能插入两次相同的文档

时间:2018-03-09 12:54:41

标签: mongodb pymongo

在我的pymongo代码中,插入两次相同的doc会引发错误:

document = {"auteur" : "romain",
            "text" : "premier post",
            "tag" : "test2",
            "date" : datetime.datetime.utcnow()}
collection.insert_one(document)
collection.insert_one(document)

加注:

DuplicateKeyError: E11000 duplicate key error collection: test.myCollection index: _id_ dup key: { : ObjectId('5aa282eff1dba231beada9e3') }

插入两个包含不同内容的文档可以正常工作。

似乎根据https://docs.mongodb.com/manual/reference/method/db.collection.createIndex/#options我应该做一些索引选项:

unique  boolean 
Optional. Creates a unique index so that the collection will not accept insertion or update of documents where the index key value matches an existing value in the index.

Specify true to create a unique index. The default value is false.

The option is unavailable for hashed indexes.

2 个答案:

答案 0 :(得分:2)

添加到Peba的答案,您可以使用python字典的.copy()方法来避免文档本身的变异。

document = {"auteur" : "romain",
            "text" : "premier post",
            "tag" : "test2",
            "date" : datetime.datetime.utcnow()}
collection.insert_one(document.copy())
collection.insert_one(document.copy())

这样,每个insert_one调用都是document的浅表副本,同时保持代码更加pythonic。

答案 1 :(得分:1)

插入文档会隐式生成_id。 因此,在插入文档后,它将变异为

document = {"_id" : ObjectId('random_id_here'),
            "auteur" : "romain",
            "text" : "premier post",
            "tag" : "test2",
            "date" : datetime.datetime.utcnow()}

由于重复的_id,尝试再次插入所述文档会导致错误。

您可以使用相同的值创建新文档并将其插入。

document = {"auteur" : "romain",
            "text" : "premier post",
            "tag" : "test2",
            "date" : datetime.datetime.utcnow()}
collection.insert_one(document)

document = {"auteur" : "romain",
            "text" : "premier post",
            "tag" : "test2",
            "date" : datetime.datetime.utcnow()}
collection.insert_one(document)