我偶然发现了一个相当奇怪的问题。我的应用程序中有一个mongo集合,大约有4 800 000条记录。我正在使用一个查询,从该集合中返回2 400 000条记录。因此,我迭代它们并在每条记录上创建嵌入式文档。当我查看我的日志时,我注意到迭代发生了超过400万次。我深入挖掘并发现,许多记录多次进入迭代。这意味着具有相同ID的记录显示为在日志中多次处理。以下是查询:
MyModel.where({integer_array: {"$not" => {'$size' => 0}}}).all.each do |n|
非常奇怪的是,当我在rails console MyModel.where({integer_array: {"$not" => {'$size' => 0}}}).count
中运行时,我得到大约2400000。
我在rails 3.2.13,mongoid 3.0.21和mongodb 2.4.0上运行。
答案 0 :(得分:2)
默认情况下,mongodb中的游标为latent。这意味着如果在处理光标时进一步写入,则可能会或可能不会看到这些更新的结果。
随着更多数据的添加或现有数据被修改,对象可能会在集合中移动,这可能导致它们多次出现在游标中(实际行为未指定)。
您可以在查询中使用pass mongoid snapshot选项来解决此问题。
(您也可以使用指定hint的'_id' index选项。)