2013-01-04 1 views
5

Monger에는 새로 삽입 한 문서를 반환하기위한 insert-and-return 함수가 있습니다.업데이트 된 문서를 Monger로 반환

update-and-return 기능이 없습니다.

업데이트를 실행하는 함수에서 업데이트 된 문서를 어떻게 반환 할 수 있습니까?

나는이 기능을 사용하여 $push과 같은 연산자를 사용할 수 없다고 생각하지만 save-and-return을 사용할 수 있다고 생각합니다.

답변

1

두 가지 옵션이 있습니다.

첫 번째 옵션은 find-and-modify 기능을 JohnnyHK's solution을 사용하는 것입니다

(mc/find-and-modify "users" 
    (select-keys my-doc [:_id]) 
    { $push { :awards { :award "IBM Fellow" 
         :year 1963 
         :by "IBM" }}} 
    :return-new true) 

두 번째 옵션은 save 대신 update을 사용하는 것입니다. mongodb에서 전체 문서를 이미로드 한 경우 좋은 선택입니다. $push과 같은 mongodb 연산자를 update-in과 같은 clojure 함수로 쉽게 바꿀 수 있습니다. clojure 맵을 이용한 조작은 나에게 더 나은 접근 방법으로 보인다. mongodb 운영자를위한 clojure 대안을 찾는 데 문제가 있으면 도움을 드릴 수 있습니다.

내 앞의 예를 들어 그것은 다음과 같이 표시됩니다

(mc/save-and-return "users" 
    (update-in my-doc [:awards] conj 
    { :award "IBM Fellow" 
     :year 1963 
     :by "IBM" })) 

나 자신을 더 Clojure의 틱 보이기 때문에 나는이 방법을 선호합니다.

4

이것은 Monger의 find-and-modify 기능의 목적입니다.

;; Atomically find the doc with a language of "Python", set it to "Clojure", and 
;; return the updated doc. 
(mgcol/find-and-modify collection 
    {:language "Python"} 
    {:$set {:language "Clojure"} } 
    :return-new true) 
+0

감사합니다. 나는 레오 니드의 대답을 받아 들였다. 왜냐하면 레오 니드의 대답은 더 낮은 평판을 얻었 기 때문에 그는 현상금에 더 많은 혜택을 줄 것이다. 두 대답을 모두 받아 들일 수 없기 때문에 나는 적어도 당신의 것을지지했다. 희망이 당신을 위해 괜찮습니다. – tobiasbayer

+0

@ CodeBrickie 레오 니드가 기본적으로 내 대답을 복사했기 때문에 나는 동의 할 수 없다. 그러나 오비완이 말했듯이 : "당신은 당연하다고 생각하는 것을해야합니다." – JohnnyHK

+0

그는 당신을 복사하고 두 번째 옵션을 추가했습니다. 그래서 그는 상당한 가치를 창출했습니다. – tobiasbayer