この質問の解決策はかなり単純に見えるかもしれませんが、私は答えがないまま手を振っています。
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は、要素が指定された値と等しくなければならないと言うのはどうでしょうか?.
この非常に単純なスコープを作成する方法に関する手がかりはありますか?.
よろしく!!!。前もって感謝します。
あなたは非常に複雑なことです。フィールドが配列を保持している場合は、配列ではないかのように検索できます。たとえば、これがドキュメントにある場合:
{ 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のドキュメントは、このことについて正確に明確ではありません(または、少なくとも明確な説明を見つけることができません)。