计数查询在mongodb中给出具有相同时间范围的不同结果

时间:2016-04-19 06:21:17

标签: mongodb

我正在使用匹配进行集合中记录的聚合,时间间隔为五分钟,如下所示

{ "$match" : { "timestamp" : { "$gt" : 1460953500000 , "$lte" : 1460953800000})

脚本以

的时间间隔运行
10:01, (interval will be 9:55 to 10:00)
10:06, (interval will be 10:00 to 10:05)

运行上面的匹配查询后,我得到不同的计数。 文件计数经过一段时间后更改为1-2分钟 例如,我在集合中运行count的查询

查询点击时间

10:01:05
    db.xxx.count({ "timestamp" : { "$gt" : 1460953500000 , "$lte" : 1460953800000})

Count : 44350

10:01:015
db.xxx.count({ "timestamp" : { "$gt" : 1460953500000 , "$lte" : 1460953800000})

Count : 44578

10:01:40
db.xxx.count({ "timestamp" : { "$gt" : 1460953500000 , "$lte" : 1460953800000})

Count : 44830

此次向前计数变得稳定。

我找到了这个 https://docs.mongodb.org/manual/core/journaling/#journal-process 日记流程

  

使用日记功能,MongoDB的存储层有两个数据集内部视图:私有视图,用于写入日志文件,以及共享视图,用于写入数据文件:

     
      
  1. MongoDB首先将写操作应用于私有视图。
  2.   
  3. 然后,MongoDB大约每100毫秒将私有视图中的更改应用于日志目录中的磁盘日志文件。 MongoDB将批处理中的写操作记录到磁盘日志文件中,称为组提交。对提交进行分组有助于最大限度地降低日记记录对性能的影响,因为这些提交必须在提交期间阻止所有编写者。写入日志是原子的,确保磁盘日志文件的一致性。有关提交间隔频率的信息,请参阅storage.journal.commitIntervalMs。

  4.   
  5. 在日记帐提交时,MongoDB会将日记中的更改应用到共享视图。

  6.   
  7. 最后,MongoDB将共享视图中的更改应用于数据文件。更确切地说,默认间隔为60秒,MongoDB要求操作系统将共享视图刷新到数据文件。操作系统可以选择以高于60秒的频率将共享视图刷新到磁盘,尤其是在系统可用内存不足的情况下。要更改写入数据文件的时间间隔,请使用storage.syncPeriodSecs设置。

  8.   

这是计数差异的原因吗?我正在使用mongodb 3.2 请帮我找到稳定的计数结果。

1 个答案:

答案 0 :(得分:0)

你自己找到了答案。要检查其工作和记录计数如何等待使用此命令写入磁盘:

db.runCommand( { serverStatus: 1 } )