web-dev-qa-db-ja.com

配列フィールドに値が含まれているかどうかのモンゴイドスコープチェック

この質問の解決策はかなり単純に見えるかもしれませんが、私は答えがないまま手を振っています。

Rails 4.1.4アプリでMongoidを使用しています。 String 値を格納する Array フィールドを含むモデルがあります。

この Array フィールドがあるインスタンスを取得するには、モデルにMongoid scope が必要です。スコープへのパラメーターとして指定された特定の 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

上記の scope は機能しません。これは、明らかにMongoDB $ elemMatch value としてCriteriaを受け取ります。しかし、Criteriaは、要素が指定された値と等しくなければならないと言うのはどうでしょうか?.

この非常に単純なスコープを作成する方法に関する手がかりはありますか?.

よろしく!!!。前もって感謝します。

20
Luis Crespo

あなたは非常に複雑なことです。フィールドが配列を保持している場合は、配列ではないかのように検索できます。たとえば、これがドキュメントにある場合:

{ 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のドキュメントは、このことについて正確に明確ではありません(または、少なくとも明確な説明を見つけることができません)。

33
mu is too short