2017-02-22 2 views
5

mongoDb에서 pymongo/pandas로 대량 업데이트/삽입하는 방법은 무엇입니까? 내가 얻는 오류는 batch op errors occurred 내가 내가하고 싶은 이유는 내가 "_id"을 설정했기 때문이다. 첫 번째 실행에서는 코드가 제대로 실행되지만 두 번째 실행에서는 실패합니다. 워크 플로우에서 팬더를 사용하고 싶습니다. 데이터에는 datetime 객체가 있습니다.MongoDB에서 PyMongo로 벌크 삽입/업데이트 수행

upsert = True의 구문은 완전히 다릅니다 (Update). "_id" 또는 "qid"을 설정할 수있는 update의 효율적인 솔루션이 유용 할 것입니다. 그러나 파이썬 datetime 객체가 있습니다!

InSQL = 'SELECT * from database2.table2 ' 
sqlOut = pd.read_sql(InSQL,cxn) 
sqlOut['_id'] = "20170101" + ":"+ sqlOut['Var'] 

dfOut = sqlOut.to_json(orient='records',date_format='iso') 
try: 
    db["test"].insert_many(json.loads(dfOut)) 
except Exception as e: print e 

가 나는 아무 대답 만료 50 PT의 현상금을 주었다. 흠 ...

+0

몽고는 'string base input'을 사용했지만 어떤 변수 삽입도 허용하지 않습니다. (이 경우를 확인하십시오.) (http://stackoverflow.com/questions/2803852/python-date-string-to-date-object), 'json.loads (dfOut)'항목으로 로컬 변수를 삽입 할 수 없습니다! 기본 키'YYYYmmDDHHMMSS' +'Counter value' – dsgdfg

+0

'BulkWriteError' 세부 사항을 파헤쳐서 무슨 일이 일어나고 있는지 더 잘 알 수 있습니다. 개인적으로 정의 된 ID가 중복되거나 12 바이트 제한을 위반했을 수 있습니다. 자세한 내용은 http://stackoverflow.com/questions/30355790/mongodb-bulk-write-error를 참조하십시오. –

+0

_id가 처음으로 작동한다는 사실은 12 바이트 제한이 문제가 아니라고 알려줍니다. 예, _id 또는 gid는 dups이며 업데이트해야합니다. – Merlin

답변

0

을 update_many 사용 두 번째 이후의 insert_many 호출에서 기존 문서의 필드와 충돌하는 필드가있는 문서를 삽입하려고하면 오류가 발생합니다. 정확하게 당신의 설정이 _id 일 것이므로 추측하면 컬렉션의 기존 _id 값과 충돌합니다.

MongoDB automatically creates an unique index on _id. 복제 값을 금지합니다.

첫 번째 버전의 문서를 삽입 한 후 번 문서를 업데이트하거나 바꿔야합니다. 기존의 문서를 컬렉션에 삽입하고 기존 문서를 업데이트하는 "upsert"개념이 실제로 있습니다.

귀하의 옵션 :

  • 대부분의 효율적인은 효율성도의 필드가 우연히의 경우와 수집에 색인되어 있는지 여부에 따라 달라 pymongo.collection.Collection.bulk_write

    import pymongo 
    
    operations = [pymongo.operations.ReplaceOne(
        filter={"_id": doc["_id"]}, 
        replacement=doc, 
        upsert=True 
        ) for doc in json.loads(dfOut)] 
    
    result = db["test"].bulk_write(operations) 
    # handle results 
    

_id. (또한 pymongo.operations.ReplaceOne 참조) 콜렉션

참고 :이 아니기 때문에 pymongo.collection.Collection.update_many가 여러분의 요구 사항에 적합하지 보인다 주어진 필터의 모든 일치에 대해 동일한 값을 설정하려고합니다.