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



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

相关内容

  • 没有找到相关文章

最新更新