如何在Ruby中运行MongoDB查询以查找带有空字段的嵌入式文档?

时间:2013-10-23 00:05:49

标签: ruby mongodb

以下用于查找带有rsvp = yes的嵌入式文档栏:

foos = MongoMapper.database[ 'foos' ]

cursor = foos.find({ 'bars.rsvp' => 'yes'   },
                   { :fields => [ 'bars.$' ]})

如何在Ruby中找到rsvp为nil或没有rsvp键 的栏

FWIW,以下似乎可以在Mongo控制台中使用:

db.foos.find({ 'bars.rsvp' : null }, { bars: { $elemMatch: { 'rsvp' : null}}})

1 个答案:

答案 0 :(得分:1)

根据你的英文描述,我认为这就是你想要的。

cursor = foos.find( { '$or' => [ { 'bars.rsvp' => nil }, { 'bars.rsvp' => { '$exists' => false } } ] } )

这是一个完整的测试脚本。

# rails c
foos = MongoMapper.database[ 'foos' ]
docs = [
    { 'bars' => { 'x' => 1, 'rsvp' => 'yes' } },
    { 'bars' => { 'x' => 2, 'rsvp' => nil } },
    { 'bars' => { 'x' => 3 } }
]
foos.remove
foos.insert(docs)
cursor = foos.find( { '$or' => [ { 'bars.rsvp' => nil }, { 'bars.rsvp' => { '$exists' => false } } ] } )
cursor.to_a

提交到'rails c',最后一行的结果如下。

=> [{"_id"=>BSON::ObjectId('527020a97f11ba2138000002'), "bars"=>{"x"=>2, "rsvp"=>nil}}, {"_id"=>BSON::ObjectId('527020a97f11ba2138000003'), "bars"=>{"x"=>3}}] 

希望这能回答你的问题而且有所帮助。