查询 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.where
、Person.any_of
、Person.excludes
等)将比 ActiveRecord 样式的查找器(将 :conditions
哈希传递给 Person.find
、Person.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 和 Ruby 查询最近 30 天的日期范围?