Pymon go получить вставленные идентификаторы даже с ошибкой повторяющегося ключа - PullRequest
0 голосов
/ 05 августа 2020

Я работаю над приложением flask и использую с ним mongodb. В одной конечной точке я взял файлы csv и вставил содержимое в mongodb с помощью insert_many(). Перед вставкой я создаю уникальный индекс для предотвращения дублирования на mongodb. Когда нет дублирования, я могу достичь inserted_ids для этого процесса, но когда возникает ошибка дублирования, я получаю None и не могу получить inserted_ids. Я также использую ordered=False. Есть ли способ получить inserted_ids даже с ошибкой дублирования ключа?

def createBulk(): #in controller
  identity = get_jwt_identity()
  try:
    csv_file = request.files['csv']
    insertedResult = ProductService(identity).create_product_bulk(csv_file)
    print(insertedResult) # this result is None when get Duplicate Key Error
    threading.Thread(target=ProductService(identity).sendInsertedItemsToEventCollector,args=(insertedResult,)).start()
    return json_response(True,status=200)
  except Exception as e:  
    print("insertedResultErr -> ",str(e))
    return json_response({'error':str(e)},400)
def create_product_bulk(self,products): # in service
        data_frame = read_csv(products)
        data_json = data_frame.to_json(orient="records",force_ascii=False)
        try:
            return self.repo_client.create_bulk(loads(data_json))
        except bulkErr as e:
            print(str(e))
            pass
        except DuplicateKeyError as e:
            print(str(e))
            pass
def create_bulk(self, products): # in repo
        self.checkCollectionName()
        self.db.get_collection(name=self.collection_name).create_index('barcode',unique=True)
        return self.db.get_collection(name=self.collection_name).insert_many(products,ordered=False)

1 Ответ

0 голосов
/ 05 августа 2020

К сожалению, не так, как вы сделали это с текущими драйверами pymon go. Как вы обнаружили, если вы получите ошибки в своем insert_many(), он вызовет исключение, и подробности исключения не содержат подробностей inserted_id s.

Он действительно содержит сведения о ключах, с которыми произошел сбой ( в e.details['writeErrors'][]['keyValue']), чтобы вы могли попробовать работать в обратном направлении от исходного списка продуктов.

Другой способ обхода - использовать insert_one() в al oop с попыткой ... кроме и проверки каждого вставить. Я знаю, что это менее эффективно, но это обходной путь ...

...