查找哈希字段包含给定值的条目 [英] Find entries where a Hash field includes a given value

查看:14
本文介绍了查找哈希字段包含给定值的条目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆