在 Monger 中有一个insert-and-return
函数用于返回一个新插入的文档。
没有update-and-return
功能。
如何从执行更新的函数返回更新的文档?
我想我可以使用save-and-return
,但在我看来,我无法使用像$push
这个函数这样的运算符。
这就是 Mongerfind-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)
我可以为您看到两个选项。
第一种选择是使用JohnnyHK 的功能解决方案find-and-modify
:
(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 加载了整个文档,这是一个不错的选择。您可以轻松地将 mongodb 运算符替换$push
为update-inclojure
等函数。对我来说,使用 clojure 地图进行操作似乎是更好的方法。如果您在为 mongodb 运算符寻找 clojure 替代品时遇到问题,我可以为您提供帮助。
对于我之前的示例,它将如下所示:
(mc/save-and-return "users"
(update-in my-doc [:awards] conj
{ :award "IBM Fellow"
:year 1963
:by "IBM" }))
我自己,我更喜欢这种方式,因为它看起来更像 Clojure 风格。