2013-01-04 20 views
5

Monger'da, yeni eklenen bir belgeyi döndürmek için insert-and-return işlevi vardır.Monger ile güncelleştirilen belge döndürme

update-and-return işlevi yoktur.

Güncelleştirilmiş bir belgeyi, güncelleştirmeyi yürüten işlevden nasıl döndürebilirim?

save-and-return'u kullanabileceğimi düşünüyorum, ancak bana bu işlevle $push gibi operatörleri kullanamıyorum.

cevap

1

Sizin için iki seçenek görüyorum.

İlk seçenek find-and-modify fonksiyonu ile JohnnyHK's solution kullanmaktır:

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

İkinci seçenek save yerine update kullanmaktır. Eğer mongodb'den yüklenen tüm belgeye sahipseniz iyi bir seçimdir. update-in gibi $push gibi mongodb operatörlerini clojure gibi işlevlerle değiştirebilirsiniz. Clojure haritaları ile manipülasyon benim için daha iyi bir yaklaşım gibi görünüyor. Eğer mongodb operatörleri için clojure alternatifleri bulmakta zorlanıyorsanız size yardımcı olabilirim.

önceki Örneğin bu gibi görünecektir:

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

Kendimi, daha Clojure-imsi görünüyor, çünkü bu şekilde tercih ediyorum.

4

Bu, Monger'in find-and-modify işlevinin amacıdır.

;; 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

teşekkürler. Leonid'in cevabını kabul ettim çünkü daha düşük bir itibara sahipti ve ödülün daha fazla faydasını görecekti. Her iki cevabı kabul edemediğimden en azından seninkini kestim. Umarım senin için uygun olur. – tobiasbayer

+0

@CodeBrickie Leonid temelde cevabımı kopyaladığından beri hemfikir değilim, ama Obiwan'ın dediği gibi: "Elbette doğru olduğunu hissettiğin şeyi yapmalısın." – JohnnyHK

+0

Seninkini kopyaladı ve ikinci bir seçenek ekledi. Bu yüzden de önemli bir değer üretti. – tobiasbayer