2013-01-04 16 views
5

W Monger jest funkcja insert-and-return do zwracania nowo wstawionego dokumentu.Zwróć zaktualizowany dokument za pomocą Monger

Nie ma funkcji update-and-return.

Jak mogę zwrócić zaktualizowany dokument z funkcji, która wykonuje aktualizację?

Myślę, że mógłbym użyć save-and-return, ale wydaje mi się, że nie mogę używać operatorów takich jak $push z tą funkcją.

Odpowiedz

1

Widzę dla ciebie dwie opcje.

Pierwsza opcja jest użycie JohnnyHK's solution z find-and-modify funkcji:

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

Drugą opcją jest użycie save zamiast update. To dobry wybór, jeśli masz już cały dokument załadowany z mongodb. Możesz łatwo zastąpić operatorów mongodb, takich jak $push z funkcjami clojure, takimi jak update-in. Manipulowanie mapami clojure wydaje mi się lepszym podejściem. Jeśli masz problemy ze znalezieniem alternatywy dla clojure dla operatorów Mongodb, mogę Ci pomóc.

Na moim poprzednim przykładzie będzie to wyglądać tak:

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

Myself, wolę ten sposób, ponieważ wygląda bardziej Clojure-owski.

4

Jest to funkcja funkcji Mongera w 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

Dzięki. Przyjąłem odpowiedź Leonida, ponieważ ma on niższą reputację i więcej skorzysta z nagrody. Ponieważ nie mogę zaakceptować obu odpowiedzi, przynajmniej wznowiłem twoje. Mam nadzieję, że to w porządku dla ciebie. – tobiasbayer

+0

@CodeBrickie Nie mogę powiedzieć, że się zgadzam, ponieważ Leonid zasadniczo skopiował moją odpowiedź, ale jak powiedział Obiwan: "Musisz oczywiście zrobić to, co uważasz za słuszne." – JohnnyHK

+0

Skopiował twoje i dodał drugą opcję. Więc on także wytworzył znaczną wartość. – tobiasbayer