查找哈希字段包含给定值的条目 [英] Find entries where a Hash field includes a given value
本文介绍了查找哈希字段包含给定值的条目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我的mongo数据库中有一个带有散列值的字段,例如:
Company.find('testCompany').categories
=> {"architects"=>"architects", "landscape_designers"=>"landscape_designers"}
如何在此字段上执行.WHERE选择?这样我就可以按单个类别查找条目了?就像我在我的数据库中搜索"LOCATURE_DESIGNSERS",并得到将其包含在三个类别中的所有条目
我找到了类似
的内容Company.where(:'categories.landscape_designers'.gt => 0)
但它不起作用。
提前谢谢!
推荐答案
如果categories
哈希中的键和值始终相同,则:
Company.where('categories.landscape_designers' => 'landscape_designers')
应该可以做到这一点。如果您只想查看categories
中是否有landscape_designers
键,则可以使用$exists
:
Company.where(:'categories.landscape_designers'.exists => true)
Company.where('categories.landscape_designers' => { :$exists => true })
请注意:
$exists
是否与包含存储null
值的字段的文档匹配。
因此$exists
将匹配:categories => { :landscape_designers => nil }
。如果要排除该病理情况,则:
Company.where(:'categories.landscape_designers'.ne => nil)
Company.where('categories.landscape_designers' => { :$ne => nil })
无论如何,我认为您的模式存在设计问题。您的categories
似乎是一个Set,而不是一个Hash,所以您混淆了字段的逻辑类型及其实现。您可以使用数组而不是哈希,并让MongoDB的多键负责搜索数组;例如,您的模型将如下所示:
field :categories, :type => Array
# and maybe some uniqueness validation or cleanup
然后您可以在搜索中将该数组视为标量:
Company.where(:categories => 'landscape_designers')
然后MongoDB将为您解开数组。
您还可以在Set
中添加几个东西:
class Set
def mongoize
self.to_a
end
def self.demongoize(object)
self.new(object)
end
def self.mongoize(object)
if(object.is_a?(Set))
object.mongoize
else
object
end
end
def self.evolve(object)
if(object.is_a?(Set))
object.mongoize
else
object
end
end
end
然后使用:
field :categories, :type => Set
获取Ruby-land中的自动设置行为和MongoDB中的数组。
这篇关于查找哈希字段包含给定值的条目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文