ruby-on-rails arrays mongodb mongoid

ruby on rails - Mongoid Scope comprueba si el campo de matriz contiene valor



ruby-on-rails arrays (1)

La solución para esta pregunta puede parecer bastante simple, pero he estado moviéndome sin respuesta.

Estoy usando Mongoid en mi aplicación Rails 4.1.4 . Tengo un modelo que contiene un campo de Array que albergará valores de String .

Necesito un alcance de Mongoid en el modelo para recuperar aquellas instancias en las que este campo de Array contenga un valor de String específico, dado como un parámetro para el alcance. Digamos que tenemos este modelo:

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

El alcance anterior no funciona porque, obviamente, en MongoDB $ elemMatch necesita recibir un Criterio como valor . Pero, ¿cómo serían los Criterios para decir simplemente que el elemento tiene que ser igual al valor dado?

¿Alguna pista sobre cómo escribir este alcance bastante simple?

¡¡¡Saludos!!!. Gracias por adelantado.


Eres cosas drásticamente demasiado complicadas. Si un campo contiene una matriz, puede buscarla como si no fuera una matriz. Por ejemplo, si tiene esto en un documento:

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

y haces una consulta como esta:

where(:some_array => ''pancakes'')

Encontrarás ese documento. No necesitas $elemMatch ni nada complicado aquí; puede pretender que la matriz es un valor único para consultas simples como usted:

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

Solo necesita ingresar a $elemMatch si desea aplicar varias condiciones a cada elemento de la matriz, cosas como estas de los documentos de $elemMatch :

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

No se sienta mal, los documentos actuales de MongoDB no son exactamente claros en este tema (o al menos no puedo encontrar una explicación explícita).