Mongoid 范围检查数组字段是不是包含值
Posted
技术标签:
【中文标题】Mongoid 范围检查数组字段是不是包含值【英文标题】:Mongoid Scope Check If Array Field Contains ValueMongoid 范围检查数组字段是否包含值 【发布时间】:2014-12-05 21:02:34 【问题描述】:这个问题的解决方案可能看起来很简单,但我一直在挥舞着没有答案。
我在我的 Rails 4.1.4 应用中使用 Mongoid。我有一个模型,其中包含一个 Array 字段,该字段将容纳 String 值。
我需要模型中的 Mongoid 的 范围 来检索此 Array 字段包含特定 String的那些实例> 值,作为范围的参数给出。假设我们有这个模型:
class SomeModel
include Mongoid::Document
include Mongoid::Timestamps
field :some_array, type: Array, default: Array.new
scope :some_scope, ->(value) elem_match(some_array: value)
end
上面的 范围 不起作用,因为很明显,在 MongoDB $elemMatch 需要接收 Criteria 作为值。但是,Criteria 怎么会只是说元素必须等于给定值???。
关于如何编写这个非常简单的作用域的任何线索???。
问候!!!。提前致谢。
【问题讨论】:
【参考方案1】:你的事情过于复杂了。如果一个字段包含一个数组,那么您可以搜索它,就好像它不是一个数组一样。例如,如果您在文档中有此内容:
some_array: [ 'where', 'is', 'pancakes', 'house?' ]
然后你做这样的查询:
where(:some_array => 'pancakes')
您会找到该文档。你不需要$elemMatch
或任何复杂的东西;你可以假装数组是一个简单的查询,就像你有:
scope :some_scope, ->(value) where(:some_array => value)
如果你想对数组的每个元素应用多个条件,你只需要进入$elemMatch
,就像$elemMatch
文档中的这样:
results: $elemMatch: $gte: 80, $lt: 85
// ^^^^^^^array ^^^^^^^^^^^^^^^^^^^^^multiple conditions
别难过,当前的 MongoDB 文档对这些东西并不十分清楚(或者至少我找不到明确的解释)。
【讨论】:
没想到会这么简单。让我试一试,如果它确实对我有用,我会告诉你。谢谢!。 完美运行。谢谢!。以上是关于Mongoid 范围检查数组字段是不是包含值的主要内容,如果未能解决你的问题,请参考以下文章
如果其中一个字段存在于 mongoid 的另一个模型中,则获取对象数组