6

几天前工作的一名工人由于某种原因停止了工作。

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

class SimilarTargets
  @queue = :similar_queue

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

    ....

  end
end

工作人员在 Target.find(target_id) 上失败,即使通过 rails 控制台传入了直字符串。

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

4

2 回答 2

8

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

假设您只想快速修复,您可以通过以下方式解决它:

target_id = target_id["$oid"] unless target_id.is_a?(String)
于 2012-07-17T04:32:19.727 回答
1

另一种选择是确保当您将 Moped::BSON::ObjectId 排入队列时,您会显式传递字符串表示形式。例如,

Resque.enqueue(MyJob, @mongoid_instance.class.to_s, @mongoid_instance.id.to_s)
于 2013-04-03T18:13:55.993 回答