我们最近将我们的应用程序升级到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
(如果它们尚未存在)。但是我该怎么做?
或者你有更好的方法吗?
答案 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)
_id
现在不再是String
,并且他们指向此gist来转换所有ID string
到ObjectId
。
答案 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')