我有一个函数,它接收条目列表,并使用monger将其保存到mongo。奇怪的是,除非我指定multi:true
,否则只有一条记录会被更新,其余的都会被忽略。我不明白为什么monger需要使用multi标志来保存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}))))
multi标志对于多更新是必要的,因为这就是mongo本身所使用的。查看文档以进行更新。当然,这是mongoshell,但当涉及到操作语义时,大多数驱动程序都会尝试遵循。
请注意,如果"id"
是唯一的,那么您一次更新一条记录,所以将:multi
设置为true
应该无关紧要。
但是,您的代码还有另一个问题。
您使用for
理解,它反过来延迟地迭代集合,也就是说,在强制实现for
返回的集合之前,不会调用mc/update
。
由于mc/update
是针对其副作用(更新数据库中的记录)进行的调用,因此使用doseq
会更合适,除非您需要结果。
如果是这种情况,请将for
封装在doall
中以强制实现:
(doall
(for [e entries]
(mc/update db "posts" {"id" (:id e)} {$set {:data (:data e)}} {:multi true})))))