我有一个函数,它接受条目列表并使用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}))))
答案 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})))))