mongoid其中查询返回的计数与实际使用枚举数不同

时间:2015-02-02 20:21:12

标签: ruby-on-rails mongodb mongoid

我有一个使用mongo作为数据存储的rails应用程序。 Mongo配置了3个查询路由器和16个分片。当我做类似的事情时:

count = Item.where(:confirmed => true).count

我得到大约800K物品。但是,当我运行批处理以实际遍历项目时,计数要小得多:

batch_size = 10000
offset_count = 0
completed_count = 0

# prime the pump
q = Item.where(:confirmed => true).limit(batch_size).skip(offset_count * batch_size).to_a

while q.count > 0
  # do something
  completed_count += q.count
  offset_count += 1
  q = Item.where(:confirmed => true).limit(batch_size).skip(offset_count * batch_size).to_a
end

# here, completed count is << count (where "count" is the initial .where count)

知道这里发生了什么吗? mongo是否估计总数而不是从索引计算它?

FWIW,有一个关于以下项目的索引:已确认,我在运行之前重新编制索引,以确保没有索引损坏。

感谢您的帮助。 凯文

1 个答案:

答案 0 :(得分:0)

只是猜测。但它似乎是操作的顺序。尝试跳过然后限制。 看起来你将它限制在1000然后跳过第一个0,然后是1000,然后是2000.在限制为1000的记录集上跳过2000将返回0.并在测试时停止。