mongodb:将对象ID转换为BSON :: ObjectId

时间:2011-07-06 13:03:44

标签: ruby-on-rails mongodb

我们最近将我们的应用程序升级到Rails3,现在我们正在使用Mongoid,我们在通过_id从mongo-db检索以前的文档时遇到问题。

经过仔细调查,旧记录(我无法通过_id检索)如下所示:

#<Audit::Log _id: 4d892bfe6bcaff4ffd000001, 
    failed: nil, request_id: "68ccb38e9e345bb7fc55331389a902a1", 
    session_id: "54940ff7e8c7336d813a872db7cb7bc0", 
    _id: "4d892bfe6bcaff4ffd000001", ... }>

并且好的记录具有以下结构:

#<Audit::Log _id: 4d892bfe6bcaff4ffd000001, 
    failed: nil, request_id: "68ccb38e9e345bb7fc55331389a902a1", 
    session_id: "54940ff7e8c7336d813a872db7cb7bc0", 
    _id: BSON::ObjectId('4d892bfe6bcaff4ffd000001'), ... }>

如您所见,_id字段不同。对于旧记录,它似乎只是一个字符串,对于新记录,它是BSON::ObjectID

我似乎无法使用旧格式检索记录。尝试使用

查找记录
Audit::Log.where(:_id => BSON::ObjectId('4d892bfe6bcaff4ffd000001')).first
Audit::Log.where(:_id => '4d892bfe6bcaff4ffd000001').first

都返回nil

但是为了好的记录,我可以做到

Audit::Log.where(:'_id' => '4e14152d6bcaff26bb000039').first

我猜,但也许Mongoid会自动将字符串转换为ObjectId以在_id上找到?我看到的唯一修复就是转换 所有_id - 字段到BSON::ObjectId(如果它们尚未存在)。但是我该怎么做?

或者你有更好的方法吗?

3 个答案:

答案 0 :(得分:7)

如果记录确实存在,所有这些都可以使用:

Account.where(:_id => "4e0a9c6142f5bc769f000008").first
Account.find(BSON::ObjectId("4e0a9c6142f5bc769f000008"))
Account.find("4e0a9c6142f5bc769f000008")

我对返回的关于Audit :: Log的JSON感兴趣...为什么返回了两个_id字段?

#<Audit::Log _id: 4d892bfe6bcaff4ffd000001, 
    failed: nil, request_id: "68ccb38e9e345bb7fc55331389a902a1", 
    session_id: "54940ff7e8c7336d813a872db7cb7bc0", 
    _id: "4d892bfe6bcaff4ffd000001", ... }>

您可能希望删除mongo驱动程序,并查看此日志是否真正存在于数据库中。除非您在audit_log.rb中声明另一个“_id”字段,否则我认为此记录不存在。

答案 1 :(得分:0)

哈,我应该进一步研究Mongoid文档。他们有一节描述how to upgrade。在升级到2.0.0.BETA.11 +的部分中,他们描述_id现在不再是String,并且他们指向此gist来转换所有ID stringObjectId

答案 2 :(得分:0)

Ex:这是一个id     1.9.3-p125:096> PROFILE_ID     =&GT; “4fe969dd79216d0af9000002“     1.9.3-p125:099&gt; BSON :: ObjectId.from_string(PROFILE_ID)     =&GT; BSON ::的ObjectId(” 4fe969dd79216d0af9000002')