【问题标题】:mongoid where query returns different count than actually using the enumeratormongoid where query 返回与实际使用枚举器不同的计数
【发布时间】:2015-02-02 20:21:11
【问题描述】:

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

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

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

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,有一个关于 :confirmed 的项目的索引,我在运行它之前重新编制了索引以确保没有索引损坏。

感谢您的帮助。 凯文

【问题讨论】:

  • 感谢回复,我尝试添加排序,没有区别,仍然只得到第一个查询中返回的大约一半的项目数。

标签: ruby-on-rails mongodb mongoid


【解决方案1】:

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

【讨论】:

  • 连接是否有可能触及完整分片的子集。 800k 结果是运行一次“Item.where”代码;而另一个正在运行“Item.where”可能多次可能连接到死分片,抛出异常或?
猜你喜欢
  • 2023-04-10
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-03
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
相关资源
最近更新 更多