Resque Worker:无效的运算符:$ oid

时间:2012-07-17 04:24:14

标签: ruby-on-rails-3 mongodb resque

几天前工作的工人因某种原因停止工作。

resque日志报告Mongo::OperationFailure的例外情况,错误为invalid operator: $oid

class SimilarTargets
  @queue = :similar_queue

  def self.perform(target_id)
    source_target = Target.find(target_id)

    ....

  end
end

即使通过rails控制台传入直接字符串,worker也会在Target.find(target_id)上失败。

Target.find(id)在控制台和代码中的其他地方工作正常,我无法弄清楚为什么这个失败了,即使工人类在上周从未改变过。

2 个答案:

答案 0 :(得分:8)

你最近升级了Mongoid吗?该错误使得它听起来像.find()方法正在接收像{"$oid": "[STRING]"}这样的东西,它是Mongo的对象ID的严格json表示。

你可以用这样的东西解决它,假设你只是想快速修复:

target_id = target_id["$oid"] unless target_id.is_a?(String)

答案 1 :(得分:1)

另一个选择是确保当你将Moped :: BSON :: ObjectId排队时,你明确地传入一个字符串表示。如,

Resque.enqueue(MyJob, @mongoid_instance.class.to_s, @mongoid_instance.id.to_s)