2016-09-18 5 views
0

У меня есть существующий метод python, который корректно выполняет операцию обновления в mongodb. У меня есть требование, где, если какой-либо документ изменен в mongodb, мне нужно создать новый документ в том же сборнике для целей аудита. Поэтому я добавил ниже фрагмент кода в существующем методе для выполнения операции вставки.mongo_connector.errors.OperationFailed: insertDocument :: вызвано :: 11000 E11000 повторяющимся индексом ошибки ключа

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 
+0

Есть способ, которым я могу удалить поле _id типа ObjectId из update_spec. Мне нужно снова вставить update_spec в коллекцию. Пожалуйста, предложите. Ниже приведен код, который я использовал, но условие удаления не работает. self.mongo [db] [coll] .remove ({update_spec [_id]: {"$ type": 7}}) self.mongo [db] [coll] .insert (update_spec) – Prasanna

ответ

0

Удалите поле идентификатора из объекта update_spec перед вставкой. Конкретный способ сделать это зависит от того, в каком поле update_spec указан идентификатор и какой тип объекта он есть.

+0

Спасибо за предложение. Ниже приведен формат update_spec update_spec: { '_id': ObjectId ('57dc1ef45cc819b6645af91d'), 'EmpName': 'qewreqwewq', 'EmpID': '12312'} – Prasanna

+0

Энди, я устал, как показано ниже, но его не как удаление поля из update_spec или вставка значений в коллекцию. Пожалуйста, дайте мне знать, как передать update_spec для удаления поля ObjectId. self.mongo [db] [coll] .remove ({"_ id": {"$ type": 7}}) self.mongo [db] [coll] .insert (update_spec) – Prasanna

 Смежные вопросы

  • Нет связанных вопросов^_^