为了达到以下目的,我想避免做两个操作:
进行更新。
这是一个常见的模式,所以应该是可能的。现在我得做两件上半身的事。(请随时调整psuedocode,我是新的查询语言)。
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
发布于 2012-01-26 20:20:44
哈桑,
您提到的对磁盘的异步写入是通过将更改写入内存,然后在后台定期将它们同步到磁盘上来完成的,因此合并这两个操作很可能不会像您想象的那样影响性能。
日志完全是另一回事--为了安全起见,它以幂等的方式单独写到磁盘上,以便在发生故障或其他类似问题时更容易恢复/恢复。如果日志写入导致重大问题,则始终可以在关闭日志的情况下启动DB,执行导入操作,然后在大容量更新完成后重新启动日志。
最后,要注意第二个修饰符中不存在的逻辑--从索引的角度来看,首选为正运算符(如exists ),否则可能不会使用索引,这肯定会减慢插入速度。
除了批量插入之外,对于单个原子更新,您还可以探索使用findAndModify (http://www.mongodb.org/display/DOCS/findAndModify+Command)为您进行检查和随后的更改,根据描述很难判断这是否合适,因为它有其自身的缺点。
https://stackoverflow.com/questions/9021078
复制相似问题