BSON::ObjectId 与 Mongo::ObjectID

Posted

技术标签:

【中文标题】BSON::ObjectId 与 Mongo::ObjectID【英文标题】:BSON::ObjectId vs Mongo::ObjectID 【发布时间】:2012-03-12 07:02:06 【问题描述】:

在online API 中,他们指的是Mongo::ObjectID

我有 require 'mongo' 但仍然 ruby​​ 找不到它。例如,我需要通过它的 Id 找到一个对象,我正在这样做:

mongo_db['post'].find(_id: Mongo::ObjectID(params[:id])).next

似乎找不到 Mongo::ObjectID 并导致:NoMethodError - undefined method ``ObjectID' for Mongo:Module:

所以过了一段时间我开始require 'bson'

mongo_db['post'].find(_id: BSON::ObjectId(params[:id])).next

它成功了!

那么 BSON::ObjectId 和 Mongo::ObjectID 之间有什么区别,我需要做什么才能使后者工作(我真的需要这样做吗)?

PS:我有

bson (1.5.2, 1.4.1)
    Authors: Jim Menard, Mike Dirolf, Kyle Banker
    Homepage: http://www.mongodb.org
    Installed at (1.5.2): /usr/local/lib64/ruby/gems/1.9.1
                 (1.4.1): /usr/local/lib64/ruby/gems/1.9.1

    Ruby implementation of BSON

mongo (1.5.2, 1.4.1)
    Authors: Jim Menard, Mike Dirolf, Kyle Banker
    Homepage: http://www.mongodb.org
    Installed at (1.5.2): /usr/local/lib64/ruby/gems/1.9.1
                 (1.4.1): /usr/local/lib64/ruby/gems/1.9.1

    Ruby driver for the MongoDB

【问题讨论】:

mongo gem 中唯一提到的“ObjectID”是在文档中,所以我怀疑Mongo::ObjectID 是旧版本遗留下来的,没有人更新文档;我只检查了 1.5.2 和 1.3.1,因为这就是我所拥有的。我在 MongoDB 中使用 BSON::ObjectId。 【参考方案1】:

Ruby 驱动程序有两个与此处相关的更改。第一个是:

https://jira.mongodb.org/browse/RUBY-158

这将 ObjectID 移动到“驼峰式”版本的 ObjectId。从 Mongo 命名空间到 BSON 命名空间的切换发生得更早(0.2),请在此处查看历史文件中的最后一个条目:

https://github.com/mongodb/mongo-ruby-driver/blob/master/docs/HISTORY.md

当然,真正的问题是文档陈旧而粗糙,所以我提交了一个拉取请求来更新它:

https://github.com/mongodb/mongo-ruby-driver/pull/90

【讨论】:

请注意 - 拉取请求已被合并 - 哇!

以上是关于BSON::ObjectId 与 Mongo::ObjectID的主要内容,如果未能解决你的问题,请参考以下文章

golang:bson.ObjectId与string转化

mgo 将 bson.objectId 转换为 html 模板中的字符串(十六进制)

python 在pymongo的bson.objectid,没有依赖,独立工作

如何检查 mongo ObjectID 在 python 中是不是有效?

使用 ObjectId 保存文档的 PHP 正在转换为 Object->oid

MongoDB 的 ObjectIds 是如何生成的?