Если ключ и значение в categories
Hash всегда одинаковы, то:
Company.where('categories.landscape_designers' => 'landscape_designers')
должен сделать трюк. Если вы просто хотите увидеть, если есть landscape_designers
ключ в categories
, то вы можете использовать $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
выглядит как набор, а не хеш, поэтому вы вводите в заблуждение логический тип полей с его реализацией. Вы можете использовать Array вместо 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
, чтобы получить автоматическое поведение набора в Руби-земля и массив внутри MongoDB.
а затем использовать его как? – marvwhere
вы можете назвать это имя метода как объект компании, такой как компания, то company.method_name – Dheer