首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么monger只更新一条记录,而不是列表中的所有记录

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

Stack Overflow用户
提问于 2014-09-28 01:02:35
回答 1查看 73关注 0票数 0

我有一个函数,可以接收条目列表,并使用monger将其保存到mongo。奇怪的是,除非我指定multi:true,否则只有一条记录会被更新,其余的记录会被忽略。我不明白为什么monger需要多重标志来持久化mongodb的所有更新。

代码语言:javascript
复制
(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}))))
EN

回答 1

Stack Overflow用户

发布于 2014-09-28 01:36:47

multi标志对于多次更新是必需的,因为这就是mongo本身所使用的。看一看update的文档。诚然,这是mongo shell,但当涉及到操作语义时,大多数驱动程序都会尝试遵循。

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

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

您使用了for理解,这反过来会延迟地迭代集合,也就是说,在强制实现for返回的集合之前,不会进行对mc/update的调用。

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

如果是这种情况,将for包装在doall中以强制实现:

代码语言:javascript
复制
(doall 
    (for [e entries] 
         (mc/update db "posts" {"id" (:id e)} {$set {:data (:data e)}} {:multi true})))))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26077070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档