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

Lui*_*spo 20 arrays ruby-on-rails mongodb mongoid

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

我在我的Rails 4.1.4应用程序中使用Mongoid.我有一个模型,其中包含一个将包含字符串值的数组字段.

我需要模型中的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
Run Code Online (Sandbox Code Playgroud)

上述范围不起作用,因为很明显,在MongoDB中, $ elemMatch需要接收Criteria作为.但是,如何判断元素必须等于给定值???

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

问候!!!.提前致谢.

mu *_*ort 33

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

{ some_array: [ 'where', 'is', 'pancakes', 'house?' ] }
Run Code Online (Sandbox Code Playgroud)

你做这样的查询:

where(:some_array => 'pancakes')
Run Code Online (Sandbox Code Playgroud)

你会找到那份文件.你不需要$elemMatch或任何复杂的东西; 你可以假装数组是简单查询的单个值,就像你有:

scope :some_scope, ->(value) { where(:some_array => value) }
Run Code Online (Sandbox Code Playgroud)

$elemMatch如果要对数组的每个元素应用多个条件,您只需要进入,这些来自$elemMatch文档:

   results: { $elemMatch: { $gte: 80, $lt: 85 } }
// ^^^^^^^array           ^^^^^^^^^^^^^^^^^^^^^multiple conditions
Run Code Online (Sandbox Code Playgroud)

不要心疼,目前的MongoDB文档对这些内容并不十分清楚(或者至少我找不到明确的解释).