我有一些代码是用 Ruby 1.9.2 补丁级别 136 编写的,我遇到一个问题,当我通过原始 ruby mongo 驱动程序中的 _id 执行 find
时,我得到一个 nil尝试使用 csv 文件中的值。这是代码:
require 'mongo'
require 'csv'
require 'bson'
# Games database
gamedb = Mongo::Connection.new("localhost", 27017).db("gamedb")
@games = gamedb.collection("games")
# Loop over CSV data.
CSV.foreach("/tmp/somedata.csv") do |row|
puts row[0] # Puts the ObjectId
@game = @games.find( { "_id" => row[0] } ).first
puts @game.inspect
end
CSV 文件如下所示:
_id,game_title,platform,upc_db_match,upc
4ecdacc339c7d7a2a6000002,TMNT,PSP,TMNT,085391157663
4ecdacc339c7d7a2a6000004,Super Mario Galaxy,Wii,Super Mario Galaxy,045496900434
4ecdacc339c7d7a2a6000005,Beowulf,PSP,Beowulf,097363473046
第一列是我已有的 Mongo 中的 objectId。如果我从 mongo 命令行执行本地查找第一列中的值,我会得到我想要的数据。但是,上面的代码在 @game.inspect
调用中返回 nil。
我尝试了以下变体,它们都产生了 nil:
@game = @games.find( { "_id" => row[0].to_s } ).first
@game = @games.find( { "_id" => row[0].to_s.strip } ).first
我什至尝试使用 BSON 类构建 ObjectId:
@game = @games.find( { "_id" => BSON::ObjectId(row[0]) } ).first
或
@game = @games.find( { "_id" => BSON::ObjectId("#{row[0]}") } ).first
两者都输出以下错误:
/Users/donnfelker/.rvm/gems/ruby-1.9.2-p136@upc-etl/gems/bson-1.4.0/lib/bson/types/object_id.rb:126:in `from_string': illegal ObjectId format: _id (BSON::InvalidObjectId)
from /Users/donnfelker/.rvm/gems/ruby-1.9.2-p136@upc-etl/gems/bson-1.4.0/lib/bson/types/object_id.rb:26:in `ObjectId'
from migrate_upc_from_csv.rb:14:in `block in <main>'
from /Users/donnfelker/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/csv.rb:1768:in `each'
from /Users/donnfelker/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/csv.rb:1202:in `block in foreach'
from /Users/donnfelker/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/csv.rb:1340:in `open'
from /Users/donnfelker/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/csv.rb:1201:in `foreach'
from migrate_upc_from_csv.rb:10:in `<main>'
疯狂的是,如果我手动创建 BSON ObjectId,它就可以工作(如下所示):
@game = @games.find( { "_id" => BSON::ObjectId("4ecdacc339c7d7a2a6000004") } ).first
当我运行@game.inspect 时,我得到了我的数据,正如我所期望的那样。但是,如果我将其更改为使用 row[0],我将得到 nil。
为什么?我究竟做错了什么?
系统详情
$ gem list
*** LOCAL GEMS ***
bson (1.4.0)
bson_ext (1.4.0)
mongo (1.4.0)
RVM 版本:rvm 1.6.9
Ruby 版本:ruby 1.9.2p136(2010-12-25 修订版 30365)[x86_64-darwin10.6.0]
蒙古版:
[initandlisten] db version v1.8.2, pdfile version 4.5
[initandlisten] git version: 433bbaa14aaba6860da15bd4de8edf600f56501b
为什么?我在这里做错了什么?谢谢!
最佳答案
第一行不被读取为标题,这样做传递 :headers => true
像这样:
require 'csv'
# Loop over CSV data.
CSV.foreach("/tmp/somedata.csv", :headers => true) do |row|
puts row[0] # Puts the ObjectId
end
如果不传入:headers参数可以看到第一个row[0]对象是字符串"_id":
_id
4ecdacc339c7d7a2a6000002
4ecdacc339c7d7a2a6000004
4ecdacc339c7d7a2a6000005
当你包含它时,你就是黄金:
4ecdacc339c7d7a2a6000002
4ecdacc339c7d7a2a6000004
4ecdacc339c7d7a2a6000005
关于ruby - 使用 ObjectId 时无法使用 Ruby 和 MongoDB 找到文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8303465/