0

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

1 回答 1

2

multi 标志对于多重更新是必要的,因为那是 mongo 本身使用的。查看更新文档。当然,这是 mongo shell,但大多数驱动程序在操作语义方面都试图遵循。

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

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

您使用一个for理解,它反过来又懒惰地迭代一个集合mc/update即在您强制实现由返回的集合之前不会进行调用for

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

如果是这种情况,fordoall强制实现:

(doall 
    (for [e entries] 
         (mc/update db "posts" {"id" (:id e)} {$set {:data (:data e)}} {:multi true})))))
于 2014-09-27T17:36:47.030 回答