MongoDB 聚合语句丢失游标错误。为什么? Rails 5.2、Mongoid 6.4

问题描述 投票:0回答:1

我多年来一直运行 Rails 5.2 项目,没有出现任何问题。它在一处使用了多个多阶段聚合。其中一些现在开始给我一个“[43:CursorNotFound]:光标ID 283353284060432170未找到(在db:27017)”错误。我可以发布其中一个聚合:

Myclass.collection.aggregate([ {'$match' => {'meta_info.store_id' => store_id_string }},
                               {'$match' => {'meta_info.invalid' => {'$in': [nil, false]} }} ,
                               {'$match' => {'test_participation' => false }} ,
                               {'$match' => {'exit_status' => 'finished' }} ,
                               datehash,
                               {'$unwind' => '$answers'},
                               {'$match' => {'answers.question_id' => q.id.to_i }},
                               {'$project' => {'answers.data.value' => 1}},
                               {'$group' => { '_id' => 0 , 'data' => { '$push' => '$answers.data.value'  }  } }
                              ]).to_a.first

其中

datehash
是另一个动态计算的
match
语句。 我将结果分配给一个变量,然后处理该变量的内容。我的数据库内容多年来一直在增长。不幸的是,我对游标一无所知。所以我有两个问题:

  1. 是聚合本身花费的时间太长,还是我的程序访问结果的速度太慢?
  2. 这是一个非常复杂的聚合,需要这么长时间是有道理的。如何指定“无超时”(或者至少超时时间长于默认的 10 秒)?我在各种文档中读到应该可以为 MongoDB 提供一个达到此效果的参数,但我一直无法找到如何实现。

如果您能给我任何关于如何简化聚合的建议,我也将不胜感激。

(我的聚合如此复杂的最初原因是它仍然比获取原始数据然后在 Rails 中进行计算要快得多。)

ruby-on-rails mongodb
1个回答
0
投票

事实证明,真正的问题在别处。游标丢失异常是由另一个并行运行的进程引起的,该进程也大量使用数据库并对数据进行复杂的计算。当我更改 cron 时间以避免重叠时,问题就消失了。

我仍然按照aneroid的建议优化了我的聚合(将所有比赛阶段合并为一个,在项目阶段添加一个 _id => 0 字段并为answers.data.value 字段命名),它确实提高了运行时间。我现在正在优化 Ruby 计算,现在速度快多了。

© www.soinside.com 2019 - 2024. All rights reserved.