我有一个函数,可以接收条目列表,并使用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}))))发布于 2014-09-28 01:36:47
multi标志对于多次更新是必需的,因为这就是mongo本身所使用的。看一看update的文档。诚然,这是mongo shell,但当涉及到操作语义时,大多数驱动程序都会尝试遵循。
请注意,如果"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})))))https://stackoverflow.com/questions/26077070
复制相似问题