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

lea*_*mer 6 mongodb resque ruby-on-rails-3

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

resque日志报告Mongo::OperationFailure错误的异常invalid operator: $oid

class SimilarTargets
  @queue = :similar_queue

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

    ....

  end
end
Run Code Online (Sandbox Code Playgroud)

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

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

MrK*_*urt 8

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

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

target_id = target_id["$oid"] unless target_id.is_a?(String)
Run Code Online (Sandbox Code Playgroud)

  • 正如MrKurt所说,Moped :: BSON :: ObjectId将JSON序列化为"{\"$ oid \":\"#{to_s} \"}".当Resque将Object Id转储到其有效负载时,在ObjectId上调用to_json,导致在以后执行该作业时对其进行存储和编组. (2认同)