我计划按如下方式构建一个应用程序:
- 节点服务器从移动设备接收日志,并在日志到达时插入到Mongo中。
- 运行增量 MapReduce 作业以从数据中计算新字段。
- 然后按分钟、小时、天等预先汇总数据。
- 一直以来,mongo 中的数据都由前端可视化应用程序查询。
我有几个顾虑:
- 如果我将非原子标志设置为 true,那么在 MapReduce 作业运行时,如果新数据被写入数据库会发生什么?
- 它是否写入数据库?如果是这样,我假设这些数据不会包含在当前的增量MapReduce作业中。
- 或者,数据库是否已锁定且写入操作丢失?
- 随着MapReduce作业和时间聚合的运行,数据库中已有的数据是否可以提供给我的前端?
谢谢!
下面介绍 MongoDB 2.6。 nonAtomic
是映射/减少的out
部分的一个选项。它与 map/reduce 如何从源集合引入文档无关,只与它将文档输出到目标集合无关。
Map/reduce使用光标在输入文档(从query
、sort
、limit
创建)上,因此光标规则适用于要映射/减少的输入文档。
当nonAtomic
false
时,在map/reduce的out
阶段,输出数据库被锁定,因此对该数据库的写入将不得不等待,并且可能会因客户端上的故障而超时。
如果nonAtomic
true
,当map/reduce的out
阶段正在运行时,可以从数据库中读取数据并将其提供给前端,但由于读取可以与map/reduce的输出交错,因此提供的数据可能处于中间状态。