如何将第二个参数传递给Mongo :: Collection#find?

时间:2012-01-13 06:22:58

标签: ruby mongodb

这是一个新手问题。我在YARD Rdoc中找到了方法定义:

(Object) find(selector = {}, opts = {})


Options Hash (opts):
:fields (Array, Hash) 

然后我尝试这个coll.find('English'=>'支点',{英语:1,中文:1}),想要结果'英语'字段是支点,只返回英文和中文字段,但Ruby用这个来惩罚我

irb(main):018:0> coll.find('English' => 'fulcrum',{English:1,Chinese:1})
SyntaxError: (irb):18: syntax error, unexpected ')', expecting tASSOC
    from /usr/local/bin/irb:12:in `<main>'
irb(main):019:0> 

我想知道原因,谢谢

通过@mu的建议纠正语法问题后,我收到了未知选项错误:

irb(main):013:0> coll.find({English:'fulcrum'},{English:1, :Chinese => 1})RuntimeError: Unknown options [{:English=>1, :Chinese=>1}]
    from /usr/local/lib/ruby/gems/1.9.1/gems/mongo-1.5.2/lib/mongo/collection.rb:234:in `find'
    from (irb):13
    from /usr/local/bin/irb:12:in `<main>'
irb(main):014:0> 

1 个答案:

答案 0 :(得分:2)

当Ruby在参数列表中看到一个未包装的Hash时:

o.m(k => v, ...)

它假设你真的是这个意思:

o.m({ k => v, ... })

所以,当你这样说时:

coll.find('English' => 'fulcrum', {English: 1, Chinese: 1})

Ruby看到了这个:

coll.find({ 'English' => 'fulcrum', {English: 1, Chinese: 1} })

Hash是一个完全有效的密钥,因此Ruby希望它后跟=> value

coll.find('English' => 'fulcrum', {English: 1, Chinese: 1} => some_value)

这就是错误消息的来源:

syntax error, unexpected ')', expecting tASSOC

如果要传递两个哈希值,则需要将第一个哈希值包装在大括号中:

coll.find({'English' => 'fulcrum'}, {English: 1, Chinese: 1})

[find]的第二个参数( http://api.mongodb.org/ruby/current/Mongo/Collection.html#find-instance_method)应该是一个选项Hash,看起来你想要:fields选项,你可以给出一个名字数组而不是一个嘈杂的哈希:

coll.find({'English' => 'fulcrum'}, :fields => %w[English Chinese])