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’)