2013-01-04 11 views
5

In Monger è presente una funzione insert-and-return per la restituzione di un documento appena inserito.Restituisce il documento aggiornato con Monger

Non c'è la funzione update-and-return.

Come posso restituire un documento aggiornato dalla funzione che esegue l'aggiornamento?

Penso di poter utilizzare save-and-return ma mi sembra di non essere in grado di utilizzare operatori come $push con questa funzione.

risposta

1

Posso vedere due opzioni per voi.

La prima opzione è quella di utilizzare JohnnyHK's solution con find-and-modify funzione:

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

Seconda opzione è quella di utilizzare save invece di update. È una buona scelta se hai già caricato l'intero documento da mongodb. È possibile sostituire facilmente gli operatori mongodb come $push con le funzioni clojure come update-in. La manipolazione con le mappe del clojure mi sembra un approccio migliore. Se hai problemi con la ricerca di alternative di clojure per gli operatori di mongodb, posso aiutarti.

Per il mio esempio precedente che sarà simile a questa:

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

me stesso, preferisco in questo modo, perché sembra più Clojure-ish.

4

Questo è lo scopo della funzione find-and-modify di Monger.

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

Grazie. Ho accettato la risposta di Leonid perché ha una reputazione inferiore e beneficerà di più della taglia. Poiché non posso accettare entrambe le risposte, ho almeno rialzato il tuo. Spero che sia ok per te. – tobiasbayer

+0

@CodeBrickie Non posso dire di essere d'accordo dal momento che Leonid ha praticamente copiato la mia risposta, ma come ha detto Obiwan: "Devi fare quello che ritieni giusto, naturalmente." – JohnnyHK

+0

Ha copiato il tuo e ha aggiunto una seconda opzione. Quindi ha prodotto anche un valore sostanziale. – tobiasbayer

Problemi correlati