我多年来一直运行 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
语句。
我将结果分配给一个变量,然后处理该变量的内容。我的数据库内容多年来一直在增长。不幸的是,我对游标一无所知。所以我有两个问题:
如果您能给我任何关于如何简化聚合的建议,我也将不胜感激。
(我的聚合如此复杂的最初原因是它仍然比获取原始数据然后在 Rails 中进行计算要快得多。)
事实证明,真正的问题在别处。游标丢失异常是由另一个并行运行的进程引起的,该进程也大量使用数据库并对数据进行复杂的计算。当我更改 cron 时间以避免重叠时,问题就消失了。
我仍然按照aneroid的建议优化了我的聚合(将所有比赛阶段合并为一个,在项目阶段添加一个 _id => 0 字段并为answers.data.value 字段命名),它确实提高了运行时间。我现在正在优化 Ruby 计算,现在速度快多了。