본문 바로가기

project/Expert

[MongoDB] BulkWriteError:duplicate Key Error (E11000) 문제해결

728x90
반응형

2차 년도에서는 셀레니움을 이용한 Crawler 개발을 주로 수행하였고,, 2022년이 접어들면서 전문가 지수를 계산하는 부분을 담당하게 되었다... 2차 년도에서는 통합 지수를 개발을 해야되는 상황이었고, 이미 전임자가 통합 지수를 1차 개발을 해놓은 상황에서 업무 인수인계를 받았다.

 

코드 인수인계를 받은 뒤 통합 지수 개발을 위해서 코드를 수정하는 과정에서 몇 가지 수정을 한 이후 MongoDB 저장하는 부분에서 아래와 같은 BulkWriteError 가 발생되었다. 해당 포스팅은 아래 에러를 해결하기 위해 시도했던 방법들을 시간 순서대로 작성할 예정이며, 마지막으로 해결된다면, 해당 오류 밑에 해결방법에 대해 업데이트 하는 형식으로 포스팅 진행하겠다. 

 

해당 오류는 MongoDB에 이미 저장된 값이 있는데 계속 insert를 하려고 하니깐 발생된 문제였다. 해당 Collection의 관련 데이터를 지우고 실행을 하니깐 잘 들어가졌다.

pymongo.errors.BulkWriteError: 
{
	'writeErrors': [
	{
		'index': 0, 
		'code': 11000, 
		'keyPattern': {'_id': 1}, 
		'keyValue': {'_id': ObjectId('6231795c6b7f38ad566e18e2')}, 
		'errmsg': "E11000 duplicate key error collection: ID.test index: 
			_id_ dup key: { _id: ObjectId('6231795c6b7f38ad566e18e2') }", 
			'op': {'_id': ObjectId('6231795c6b7f38ad566e18e2'), 
			'fid': 0, 
			'keyId': 2276732, 
			'name': '홍길동', 
			'inst': '한국대학교', 
			'SCIENCEON': {
				'inst': '한국대학교 컴퓨터공학부', 
				'A_id': ['s1510292'], 
				'papers': [ObjectId('6231794bd21827e888e2fdbd')], 
				'oriInst': '한국대학교'
				}, 
			'KCI': {
				'inst': '한국대학교', 
				'A_id': ['s545553'], 
				'papers': [ObjectId('623179557b75355e87e2df43')], 
				'oriInst': '한국대학교'
				}, 
			'numProjects': 0, 
			'numPapers': 2, 
			'totalCitation': 0, 
			'recentYear': 2021, 
			'totalCoop': 0, 
			'score': 0, 
			'coopList': [], 
			'factor': {
				'ntisQual': 0, 
				'remainQual': 0.09531017980432493, 
				'lct': 0.5, 
				'acc': 0, 
				'coop': 0, 
				'qunt': 2
				}
			}
		}
	], 
	'writeConcernErrors': [], 
	'nInserted': 0, 
	'nUpserted': 0, 
	'nMatched': 0, 
	'nModified': 0, 
	'nRemoved': 0, 
	'upserted': []
}

1. 첫 번째 문제해결 접근

수정하기 전 코드의 상황은 아래와 같이 생긴 상황이고, insert_many()를 통해 한번에 mongoDB에 저장을 하는 형식으로 진행하고 있었다. 하지만, 내가 코드를 수정한 이후 insert_many() 부분에서 위와 같은 오류가 발생하였다.

data = [{k:v}, {k:v}, {k:v}, ... , {k:v}, {k:v}, {k:v}]

ls = []
for doc in data:
	doc['A'] = value
    doc['B'] = value
    doc['C'] = value
    
    temp = {}
    temp['D'] = value
    temp['E'] = value
    temp['F'] = value
    doc['tmp'] = temp
    ls.append(doc)

db['col_name'].insert_many(ls)

첫 번째로 시도 했던 방법은 ls에 다 담지 말고 반복문 안에서 한개씩 insert_one 하는 방식으로 시도해보았다.

data = [{k:v}, {k:v}, {k:v}, ... , {k:v}, {k:v}, {k:v}]

# ls = []
for doc in data:
    doc['A'] = value
    doc['B'] = value
    doc['C'] = value
    
    temp = {}
    temp['D'] = value
    temp['E'] = value
    temp['F'] = value
    doc['tmp'] = temp
    
    db['col_name'].insert_one(doc)

다음과 같이 DuplicateKeyError 동일한 문제가 발생하였다.

pymongo.errors.DuplicateKeyError: E11000 duplicate key error collection: ID.test index: _id_ dup key: { _id: ObjectId('6231795c6b7f38ad566e18e2') }, full error: {'index': 0, 'code': 11000, 'keyPattern': {'_id': 1}, 'keyValue': {'_id': ObjectId('6231795c6b7f38ad566e18e2')}, 'errmsg': "E11000 duplicate key error collection: ID.test index: _id_ dup key: { _id: ObjectId('6231795c6b7f38ad566e18e2') }"}

 

2. 두 번째 문제해결 접근

해당 컬렉션에 중복된 키가 있다는 Error라서 해당 컬렉션에 있는 데이터를 다 지우고 실행을 했더니 해결되었다...

하지만 다른 부분에서 오류가 발생되었는데, 내가 일부 코드를 추가하지 않아서 발생된 문제라 패스..

 

728x90
반응형