我有一些代码写在Ruby 1.9.2补丁程序级别136,我有一个问题,当我通过原始ruby mongo驱动程序中的_id执行find
我得到尝试使用csv文件中的值时为零。下面的代码:使用ObjectId时无法找到与Ruby和MongoDB的文档
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
的第一列是OBJECTID在蒙戈,我已经有了。如果我从mongo命令行执行本地查找第一列中的值,我将获得我想要的数据。但是,上述代码在@game.inspect
调用中返回零。
我尝试了以下的变化,而这一切产生零:
@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/[email protected]/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/[email protected]/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我得到我的数据备份,如我会期待。但是,如果我改变这个使用行[0],我得到零。
为什么?我究竟做错了什么?
系统详细
$ gem list
*** LOCAL GEMS ***
bson (1.4.0)
bson_ext (1.4.0)
mongo (1.4.0)
RVM版本:rvm 1.6.9
红宝石版本:ruby 1.9.2p136 (2010-12-25 revision 30365) [x86_64-darwin10.6.0]
蒙戈版本:
[initandlisten] db version v1.8.2, pdfile version 4.5
[initandlisten] git version: 433bbaa14aaba6860da15bd4de8edf600f56501b
再次,为什么呢?我在这里做错了什么?谢谢!
这不是我说的吗? –
对不起!在我开始写作之前,我没有刷新页面。至少Donn现在也有一个明确的答案,可能会更清楚一点。我在我的电脑上试过上面的内容,可以确认我们的解决方案可以解决他遇到的问题,并且他可以接受答案。如果我在这里踩任何脚趾道歉。 –
接受这个作为代码示例的答案显示我需要什么。我没有使用FasterCSV(我知道它已被1.9.2等等替换)等等。尽管如此,我仍然投票赞成原创。谢谢! –