2017-05-01 3 views
0

MongoDB의 설립 문서를 pymongo로 어떻게 업데이트 할 수 있습니까? 예를 들어MongoDB의 커서 문서를 pymongo로 업데이트하는 방법은 무엇입니까?

: 나는 과일의 무게를 얻고 싶은

name weight amount 
------------------------- 
apple  2   3 
banana 2   5 

: 나는 데이터 집합이 무게 * 양

name weight amount total 
----------------------------------- 
apple  2   3  6 
banana 2   5  10 

어떻게 커서 문서를 업데이트 할 수 있습니다를 ????

myFile = [ 
    {"name":"Appel", "weight":2, "amount":3}, {"name":"banana", "weight":2, "amount":5} 
] 

myCollection.insert_many(myFile) 

fruits = myCollection.find() 

for fruit in fruits: 
    total = fruit["weight"]*fruit["amount"] 
    ????? What should I do now? ????? 

답변

1

당신은 replace_one()을 사용하여 다음과 같이 새 필드 total로 컬렉션을 업데이트 할 수 있습니다 하나 대신하여 문서를 컬렉션을 루핑 및 저장의

for fruit in fruits: 
    fruit["total"] = fruit["weight"] * fruit["amount"] 
    myCollection.replace_one({"_id": fruit["_id"]}, fruit) 
은 주목할 가치가

, 당신은해야 PyMongo Bulk Write Operations, 특히 Unordered Bulk Write Operations

사용 사례에 따라 Aggregation Pipeline을 사용하여 값 서버 측을 계산할 수도 있습니다.

db.fruits.aggregate([ 
    {$project:{name:1, 
      weight:1, 
      amount:1, 
      total:{$multiply:["$weight", "$amount"]}}}, 
    {$out:"fruits_modified"} 
]); 

weightamount 필드의 승산 결과의 값이 새로운 분야 total 돌출 상기 집약 파이프 라인. 결과를 fruits_modified이라는 다른 콜렉션에 저장하십시오. 그런 다음 fruits 수집을 드롭과의 스왑 fruits_modified의 이름을 변경, 예를 들어 수 있습니다 컬렉션이 가 손실 될 수 있습니다 제거되는 동안 어떤 작업이 수행되는 것을

db.fruits.drop(); 
db.fruits_modified.renameCollection("fruits"); 

참고. 두 가지 방법 모두를 고려하고 사용 사례에 따라 사용하십시오.

+0

안녕하세요 @ 완 바티 아타, 답변 주셔서 감사합니다. 하지만 여전히 "save()"라는 질문이 있는데, 경고 메시지가 나타납니다 : "DeprecationWarning : 저장이 권장되지 않습니다. 대신 insert_one 또는 replace_one을 사용하십시오". 그래서 insert_one() 또는 replace_one()을 사용하면 첫 번째 매개 변수로 필터를 제공해야합니다. 사실입니까? – xirururu

+0

질문에 답변 할 수 있도록 코드를 업데이트했습니다. 이제는 [ObjectId] (https://docs.mongodb.com/manual/reference/method/ObjectId/) 값과 일치하는 문서를 검색하여 계산 된 문서로 대체합니다. –