2014-10-10 16 views
17

La soluzione per questa domanda potrebbe sembrare piuttosto semplice, ma sono stato in giro senza risposta.Controllo mongolo Verificare se il campo Array contiene il valore

Sto usando Mongoide nel mio Rails 4.1.4 app. Ho un modello che contiene un campo Array che ospiterà i valori String.

Ho bisognoportata una di Mongoid nel modello per recuperare quei casi in cui questo Array campo contiene un valore specifico String, dato come parametro al campo di applicazione. Diciamo che abbiamo questo modello:

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 

È possibile che questo ambito non funziona perché, ovviamente, in MongoDB$ elemMatch ha bisogno di ricevere un Criteri come valore. Ma, come sarebbe il Criteri per dire solo che l'elemento deve essere uguale al valore dato ???.

Eventuali indizi su come scrivere questo ambito piuttosto semplice ???.

Saluti !!!. Grazie in anticipo.

risposta

25

Le cose sono drasticamente complicate. Se un campo contiene un array, puoi cercarlo come se non fosse un array. Ad esempio, se si dispone di questo in un documento:

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

e fare una query come questa:

where(:some_array => 'pancakes') 

troverete quel documento. Non hai bisogno di $elemMatch o di qualcosa di complicato qui; si può far finta che la matrice è un singolo valore per le query semplici come avete:

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

Hai solo bisogno di entrare in $elemMatch se si desidera applicare più condizioni ad ogni elemento della matrice, le cose come questo dal $elemMatch docs:

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

non si sentono male, gli attuali documenti MongoDB non sono esattamente chiaro su questa roba (o almeno non riesco a trovare una spiegazione esplicita).

+0

Non è venuto ai miei pensieri che potrebbe essere così semplice. Lasciami fare un tentativo e ti farò sapere se ha davvero funzionato per me. Grazie!. –

+0

Funziona perfettamente. Grazie!. –

Problemi correlati