首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mongodb任何用于将两个上列折叠为一个的成语:创建、修饰符到集-默认值、修饰符到更新-现有文档。

mongodb任何用于将两个上列折叠为一个的成语:创建、修饰符到集-默认值、修饰符到更新-现有文档。
EN

Stack Overflow用户
提问于 2012-01-26 16:04:22
回答 1查看 136关注 0票数 0

为了达到以下目的,我想避免做两个操作:

  1. 查找文档,使用修饰符-1进行更新,如果文档不存在,则使用修饰符-2填充默认字段,然后使用修饰符-1.

进行更新。

这是一个常见的模式,所以应该是可能的。现在我得做两件上半身的事。(请随时调整psuedocode,我是新的查询语言)。

代码语言:javascript
复制
update( {...}, modifier-1, true)

if(upserted) 
{
    // check for race condition, detect if another query from another thread
    // hasn't populated the default values.
    update ( {...,if_a_default_value_does_not_exist}, modifier-2, true)
}

我假设两个操作会导致两个磁盘写入,我理解mongodb会执行异步磁盘写入。如果我不能通过一次操作完成这一任务,那么是否有某种机制可以在写入日志/磁盘之前将这些写入合并到单个写入中?是的,这将对加载我的300 gb数据集产生重大影响:D

EN

回答 1

Stack Overflow用户

发布于 2012-01-26 20:20:44

哈桑,

您提到的对磁盘的异步写入是通过将更改写入内存,然后在后台定期将它们同步到磁盘上来完成的,因此合并这两个操作很可能不会像您想象的那样影响性能。

日志完全是另一回事--为了安全起见,它以幂等的方式单独写到磁盘上,以便在发生故障或其他类似问题时更容易恢复/恢复。如果日志写入导致重大问题,则始终可以在关闭日志的情况下启动DB,执行导入操作,然后在大容量更新完成后重新启动日志。

最后,要注意第二个修饰符中不存在的逻辑--从索引的角度来看,首选为正运算符(如exists ),否则可能不会使用索引,这肯定会减慢插入速度。

除了批量插入之外,对于单个原子更新,您还可以探索使用findAndModify (http://www.mongodb.org/display/DOCS/findAndModify+Command)为您进行检查和随后的更改,根据描述很难判断这是否合适,因为它有其自身的缺点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9021078

复制
相关文章

相似问题

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