为什么monger只更新一条记录而不是列表中的所有记录

时间:2014-09-27 17:02:35

标签: clojure monger

我有一个函数,它接受条目列表并使用monger将其保存到mongo。 奇怪的是,除非我指定multi:true,否则只会更新一条记录而忽略其余记录。 我不明白为什么monger需要多标志才能将所有更新保存到mongodb。

(defn update-entries
   [entries]
   (let [conn (mg/connect)
         db (mg/get-db conn "database")]
     (for [e entries] (mc/update db "posts" {"id" (:id e)} {$set {:data (:data e)}} {:multi true}))))

1 个答案:

答案 0 :(得分:2)

多标志是多重更新所必需的,因为它是mongo本身使用的。看一下update的文档。当然,这是mongo shell,但大多数驱动程序在操作语义方面都会尝试遵循。

请注意,如果"id"是唯一的,那么您一次更新一条记录,因此将:multi设置为true并不重要。

但是,您的代码还有另一个问题。

你使用for理解,然后反复收集懒惰的集合,即不会调用mc/update,直到你强制实现由for返回的集合。

由于mc/update是为它的副作用(更新数据库中的记录)而进行的调用,因此使用doseq将更加合适,除非您需要结果。

如果是这种情况,请在for中包裹doall以强制实现:

(doall 
    (for [e entries] 
         (mc/update db "posts" {"id" (:id e)} {$set {:data (:data e)}} {:multi true})))))
相关问题