MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Rails mongoid regex su un campo intero

La soluzione MongoDB dalla domanda collegata sarebbe:

db.models.find({ $where: '/^124/.test(this.number)' })

Cose che consegni a find mappa praticamente uno a uno su Mongoid:

where(:$where => "/^#{numero.to_i}/.test(this.number)")

Il to_i call dovrebbe rendere corretta l'interpolazione delle stringhe per questo caso limitato.

Tieni presente che questa è una cosa piuttosto orribile da fare al tuo database:non può utilizzare gli indici, eseguirà la scansione di ogni singolo documento nella raccolta, ...

Potrebbe essere meglio usare un campo stringa in modo da poter eseguire la normale corrispondenza delle espressioni regolari. Sono abbastanza sicuro che MongoDB sarà in grado di utilizzare un indice se ancori la tua espressione regolare anche all'inizio. Se hai davvero bisogno che sia un numero all'interno del database, puoi sempre memorizzarlo sia come intero che come campo String:

field :number,   :type => Integer
field :number_s, :type => String

e poi avere alcuni hook per mantenere :number_s aggiornato come :number i cambiamenti. Se lo facessi, il tuo ambito di corrispondenza del modello guarderebbe :number_s . Il precalcolo e la duplicazione di dati come questo sono abbastanza comuni con MongoDB, quindi non dovresti sentirti male.