查询 Mongoid 哈希字段

Posted

技术标签:

【中文标题】查询 Mongoid 哈希字段【英文标题】:Query on Mongoid Hash Field 【发布时间】:2011-05-13 15:21:22 【问题描述】:

我想查询 Mongoid 类的哈希字段。我不确定如何在有条件的情况下做到这一点?

这是一个例子:

class Person
  include Mongoid::Document

  field :things, :type => Hash
end

所以,假设我有这个:

p = Person.new
p.things = 
p.things[:tv] = "Samsung"

我想查询第一个拥有三星电视的人...

People.first(:conditions => ?????

提前致谢。

【问题讨论】:

【参考方案1】:
Person.where('things.tv' => 'Samsung').first

这是 Mongoid 和 MongoDB 真正闪耀的地方。 Mongoid 的 Criteria 方法(Person.wherePerson.any_ofPerson.excludes 等)将比 ActiveRecord 样式的查找器(将 :conditions 哈希传递给 Person.findPerson.first 等)提供更多的灵活性

Mongoid 的网站上有一些关于如何使用 Criteria 的精彩文档:

http://mongoid.org/en/mongoid/docs/querying.html

【讨论】:

当我尝试得到以下错误:“BSON::InvalidKeyName: key must not contain '.'” 没关系。该错误是当我试图在我的“.create”方法上使用该语法时。谢谢,效果很好。 好吧,现在的问题是,当 People 使用“save”持久化,然后使用“where”方法检索时,您无法再访问 p.things[:tv].. 它有成为 p.things['tv']。 Mongoid 将其转换为字符串。关于为什么会这样的任何想法? 哈希的键必须是根据 BSON 规范的字符串。使用 p.things[:tv] 设置值在技术上是无效的,但 Mongoid 正在为您转换为字符串。这是 MongoDB 本身的问题:mongodb.org/display/DOCS/… 不过,您可以将符号存储为值。对于密钥,您只需使用 p.things['tv'] 。 不,实际上是@bowsersenior,您说的这一点比 MongoID 文档页面要清楚得多。我读了好几遍了,没看懂。

以上是关于查询 Mongoid 哈希字段的主要内容,如果未能解决你的问题,请参考以下文章

Mongoid 按值或默认值查询

使用 Mongoid 和 Ruby 查询最近 30 天的日期范围?

RoR3 上的 Mongoid:1)如何在查询中返回特定字段? 2)需要啥 inverse_of ?

Mongoid 范围检查数组字段是不是包含值

使用 Mongoid 批量插入/更新?

Mongoid:如何防止批量赋值创建未定义的字段?