mongo_connector.errors.OperationFailed:insertDocument ::由:: 11000引起的E11000重复键错误索引

时间:2016-09-18 04:43:06

标签: mongodb pymongo mongo-java

我有一个现有的python方法,它正在mongodb中正确地进行更新操作。我有一个要求,如果在mongodb中修改了任何文档,我需要在同一个集合中创建一个新文档用于审计目的。所以我在现有方法下面添加了一段代码来执行插入操作。

self.mongo[db][coll].insert(update_spec)

由于我将现有文档的相同ObjectId传递给我的插入操作,因此失败并出现以下异常,

mongo_connector.errors.OperationFailed: insertDocument :: caused by :: 11000 E11000 duplicate key error index: mongotest1.test.$_id_  dup key: { : ObjectId('57dc1ef45cc819b6645af91d') }

有没有办法忽略现有文档的ObjectId,以便我可以在新插入的文档中插入其他现有值?请建议。以下是完整的代码。

def update(self, document_id, update_spec, namespace, timestamp):
        """Apply updates given in update_spec to the document whose id
        matches that of doc.

        """
        db, coll = self._db_and_collection(namespace              

        self.mongo[db][coll].insert(update_spec)

        self.meta_database[meta_collection_name].replace_one(
            {self.id_field: document_id, "ns": namespace},
            {self.id_field: document_id,
             "_ts": timestamp,
             "ns": namespace},
            upsert=True)        

        no_obj_error = "No matching object found"
        updated = self.mongo[db].command(
            SON([('findAndModify', coll),
                 ('query', {'_id': document_id}),
                 ('update', update_spec),
                 ('new', True)]),
            allowable_errors=[no_obj_error])['value']       
        return updated

1 个答案:

答案 0 :(得分:0)

在插入之前从/:Id对象中删除id字段。执行此操作的具体方法取决于update_spec的哪个字段是id,以及它是什么对象类型。