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

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

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

 # 

良好的记录具有以下结构:

 # 

如您所见, _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 -fields转换为BSON::ObjectId如果它们还没有)。 但是我该怎么做?

或者你有更好的方法吗?

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

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

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

 # 

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

哈,我应该进一步研究Mongoid文档。 他们有一节描述如何升级 。 在升级到2.0.0.BETA.11 +的部分中,他们描述了_id现在不再是String ,他们指向这个要点将你的所有id从string转换为ObjectId

例如:这是一个id 1.9.3-p125:096> profile_id =>“4fe969dd79216d0af9000002”1.9.3-p125:099> BSON :: ObjectId.from_string(profile_id)=> BSON :: ObjectId(’4fe969dd79216d0af9000002’)