MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Railt mongoide Regex auf einem Integer-Feld

Die MongoDB-Lösung aus der verknüpften Frage wäre:

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

Dinge, die Sie zum find abgeben Mongoid ziemlich genau eins zu eins abbilden:

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

Der to_i Aufruf sollte die String-Interpolation für diesen begrenzten Fall in Ordnung bringen.

Denken Sie daran, dass dies eine ziemlich schreckliche Sache ist, die Sie Ihrer Datenbank antun können:Sie kann keine Indizes verwenden, sie wird jedes einzelne Dokument in der Sammlung scannen, ...

Möglicherweise ist es besser, ein Zeichenfolgenfeld zu verwenden, damit Sie einen normalen Regex-Abgleich durchführen können. Ich bin mir ziemlich sicher, dass MongoDB einen Index verwenden kann, wenn Sie Ihre Regex auch am Anfang verankern. Wenn Sie wirklich eine Zahl in der Datenbank benötigen, können Sie sie immer sowohl als Integer- als auch als String-Feld speichern:

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

und dann haben Sie einige Hooks, um :number_s zu behalten aktuell als :number Änderungen. Wenn Sie dies tun, würde Ihr Mustervergleichsbereich :number_s betrachten . Das Vorberechnen und Duplizieren von Daten wie dieses ist bei MongoDB ziemlich üblich, also sollten Sie sich deswegen nicht schlecht fühlen.