Mongo 문서를 삽입 한 후 업데이트하려면 어떻게합니까?


83

문서를 삽입한다고 가정 해 보겠습니다.

post = { some dictionary }
mongo_id = mycollection.insert(post)

이제 필드를 추가하고 업데이트하고 싶다고 가정 해 보겠습니다. 어떻게하나요? 작동하지 않는 것 같습니다 .....

post = mycollection.find_one({"_id":mongo_id}) 
post['newfield'] = "abc"
mycollection.save(post)

답변:


108

pymongo에서 업데이트 할 수 있습니다 :
mycollection.update({'_id':mongo_id}, {"$set": post}, upsert=False)
데이터베이스에서 게시물을 찾을 수없는 경우 업데이트하는 대신 Upsert 매개 변수가 삽입됩니다.
문서는 mongodb 사이트 에서 사용할 수 있습니다 .

UPDATE 버전> 3의 경우 update 대신 update_one사용하십시오 .

mycollection.update_one({'_id':mongo_id}, {"$set": post}, upsert=False)


1
@Elliott-다른 대안은 무엇입니까?
ajayramesh

29
mycollection.find_one_and_update({"_id": mongo_id}, 
                                 {"$set": {"newfield": "abc"}})

당신을 위해 훌륭하게 작동해야합니다. id의 문서가 mongo_id없으면을 함께 사용하지 않으면 실패합니다 upsert=True. 기본적으로 이전 문서를 반환합니다. 새 계정을 얻으려면 return_document=ReturnDocument.AFTER. 모든 매개 변수는 API에 설명되어 있습니다.

이 방법은 MongoDB 3.0에 도입되었습니다. 3.2, 3.4 및 3.6으로 확장되었습니다.


2
"username"fyi와 같은 다른 필드에 대해 "_id"를 하위 항목으로 지정하면 작동합니다.
Chris

1
@Chris "current pymongo"라고 말하면 미래의 사람들은 동일한 버전을 가지고 있지 않을 수 있습니다. 구체적으로 말하는 것이 좋습니다.
Mnebuerquo

@Mnebuerquo 이것은 내가 그렇지 않으면 보지 못했을 훌륭한 포인트입니다. 향후 게시물에서 할 것입니다.
Chris

@Chris 편집은 많은 도움이됩니다. 감사! 그리고 내가 이것을 잊고 다시 찾아야 할 때 future-me로부터 감사합니다!
Mnebuerquo

22

collection.save(the_changed_dict)이 방법으로 사용 하겠습니다. 나는 이것을 방금 테스트했으며 여전히 나를 위해 작동합니다. 다음은에서 직접 인용 한 것입니다 pymongo doc..

save(to_save[, manipulate=True[, safe=False[, **kwargs]]])

이 컬렉션에 문서를 저장합니다.

to_save에 이미 "_id"가 있으면 update () (upsert) 작업이 수행되고 해당 "_id"가있는 기존 문서를 덮어 씁니다. 그렇지 않으면 insert () 작업이 수행됩니다. 이 경우 조작이 True이면 "_id"가 to_save에 추가되고이 메서드는 저장된 문서의 "_id"를 반환합니다. 조작이 False이면 "_id"가 서버에 의해 추가되지만이 메서드는 None을 반환합니다.


9

이것은 오래된 질문이지만 답변을 찾을 때 이것을 우연히 발견했기 때문에 참조를 위해 답변에 대한 업데이트를 제공하고 싶었습니다.

save및 메서드 update는 더 이상 사용되지 않습니다.

save (to_save, navigate = True, check_keys = True, ** kwargs) ¶ 문서를이 컬렉션에 저장합니다.

DEPRECATED-대신 insert_one () 또는 replace_one ()을 사용하십시오.

버전 3.0에서 변경 : safe 매개 변수가 제거되었습니다. 확인되지 않은 쓰기 작업에 대해 w = 0을 전달합니다.

update (spec, document, upsert = False, 조작 = False, multi = False, check_keys = True, ** kwargs)이 컬렉션의 문서를 업데이트합니다.

DEPRECATED-대신 replace_one (), update_one () 또는 update_many ()를 사용하십시오.

버전 3.0에서 변경 : safe 매개 변수가 제거되었습니다. 확인되지 않은 쓰기 작업에 대해 w = 0을 전달합니다.

OP의 특정 경우에는 replace_one.


9

문서 삽입 (삽입은 더 이상 사용되지 않음) 이라는 제목의 PyMongo에 대한 최신 문서 와 다음과 같은 방어 적 접근 방식에 따라 다음과 같이 삽입하고 업데이트해야합니다.

result = mycollection.insert_one(post)
post = mycollection.find_one({'_id': result.inserted_id})

if post is not None:
    post['newfield'] = "abc"
    mycollection.save(post)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.