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

时间:2014-10-10 16:13:25

标签: ruby-on-rails arrays mongodb mongoid

这个问题的解决方案可能看起来很简单,但是我一直挥手无言。

我在 Rails 4.1.4 应用中使用 Mongoid 。我有一个模型,其中包含 Array 字段,该字段将包含 String 值。

我需要在模型中使用 Mongoid 范围来检索此数组字段包含特定的实例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 需要接收条件< / strong>作为。但是, Criteria 如何才能说元素必须等于给定值???。

关于如何编写这个非常简单的范围的任何线索???。

问候!!!。提前谢谢。

1 个答案:

答案 0 :(得分:32)

你的事情过于复杂。如果一个字段包含一个数组,那么你可以搜索它,好像它不是一个数组。例如,如果您在文档中有此内容:

{ some_array: [ 'where', 'is', 'pancakes', 'house?' ] }

你做了这样的查询:

where(:some_array => 'pancakes')

你会找到那份文件。你不需要$elemMatch或其他任何复杂的东西;您可以假装数组是简单查询的单个值,例如:

scope :some_scope, ->(value) { where(:some_array => value) }

如果你想对数组的每个元素应用多个条件,你只需要进入$elemMatch,这样的事情来自$elemMatch docs:

   results: { $elemMatch: { $gte: 80, $lt: 85 } }
// ^^^^^^^array           ^^^^^^^^^^^^^^^^^^^^^multiple conditions

感觉不好,目前的MongoDB文档对这些内容并不十分清楚(或者至少我找不到明确的解释)。