【问题标题】:Rails and mongoid returning duplicate records for queryRails 和 mongoid 返回重复记录以供查询
【发布时间】:2013-05-31 22:32:13
【问题描述】:

我偶然发现了一个相当奇怪的问题。我的应用程序中有一个 mongo 集合,其中包含大约 4 800 000 条记录。我正在使用从该集合返回 2 400 000 条记录的查询。因此,我遍历它们并在每条记录上创建嵌入文档。当我查看我的日志时,我注意到迭代发生了超过 400 万次。我深入挖掘并发现,很多记录多次进入迭代。这意味着具有相同 ID 的记录在日志中多次出现在处理中。以下是查询:

MyModel.where({integer_array: {"$not" => {'$size' => 0}}}).all.each do |n|

非常奇怪的是,当我在 rails 控制台 MyModel.where({integer_array: {"$not" => {'$size' => 0}}}).count 中运行时,我得到大约 2400000。 我在 rails 3.2.13、mongoid 3.0.21 和 mongodb 2.4.0 上运行。

【问题讨论】:

    标签: mongodb ruby-on-rails-3.2 mongoid


    【解决方案1】:

    mongodb 中的游标默认为latent。这意味着,如果在您处理游标时进一步写入,那么您可能会也可能不会看到这些更新的结果。

    当添加更多数据或修改现有数据时,对象可能会在集合中移动,这可能导致它们多次出现在光标中(实际行为未指定)。

    您可以在查询中使用 pass mongoid snapshot 选项来解决此问题。

    (您也可以使用hint 选项指定'_id' index。)

    【讨论】:

    • 是的,谢谢伙计,就是这样。我像这样修改了我的查询:MyModel.where({integer_array: {"$not" => {'$size' => 0}}}).hint("_id" => 1).each do |n|
    • 非常感谢,如果没有这个答案,我会花很多时间尝试调试类似的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    相关资源
    最近更新 更多