ruby-on-rails mongoid

ruby-on-rails - default value mongoid



Sintaxis de consulta de Mongoid OR (5)

Esto debe pedirse mucho pero está muy mal documentado. No hay ninguna mención en http://mongoid.org/en/mongoid/docs/querying.html

Estoy intentando verificar si existe un usuario (a continuación hay una consulta AND), ¿cómo puedo cambiarlo a una consulta de tipo OR

Username.where(:username=>@username, :email=>@email)

(El correo electrónico o el nombre de usuario deben coincidir).

He encontrado algunas formas bastante complicadas en línea, incluido el envío de un javascript directo (de): http://omarqureshi.net/articles/2010-6-17-using-or-in-mongoid

¿Seguramente debe haber una sintaxis clara y simple para hacer esto correctamente?


Además, en Mongoid 5.0, si aún desea utilizar el método where , use el siguiente

Username.where(''$or'' => [ { username: @username }, { email: @email } ])

Esto es muy útil cuando está creando un tipo de hash de consulta de forma dinámica y necesita mantener el método where


En Mongoid 5.0, esto funciona para mí.

Username.or({username: @username}.or({email: @email})


Hay un error tipográfico en la respuesta de @miguel-savignano. Según , la "cola de edición está llena", por lo que no envié una edición.

Sintaxis adecuada:

Username.or({username: @username}).or({email: @email})

Una solución más concisa:

Username.or({username: @username}, {email: @email})

El selector Mongo se resolverá para:

{"$or"=>[{"username"=>@username}, {"email"=>@email}]}

Encontré esta pregunta cuando intentaba resolver para crear consultas "o".

Si está buscando hacer coincidir una cadena o cualquiera de una matriz de elementos, entonces deberá escribir una consulta de Mongoid con el selector Mongo ''$ in''.

Por ejemplo, tienes un nombre de usuario específico y una gran variedad de correos electrónicos. Le gustaría devolver todos los resultados donde al menos uno de los campos coincida con el nombre de usuario o uno de los correos electrónicos dentro de la matriz.

@username = "jess" @emails = ["[email protected]", "[email protected]", "[email protected]"] User.or({username: ""}, {email: {''$in'': @emails}})

El selector Mongo se resolverá para:

{"$or"=>[{"first_name"=>""}, {"email"=>{:$in=>["[email protected]", "[email protected]", "[email protected]"]}}]}

  • Si tiene Users con 2 de los 3 correos electrónicos en su base de datos, entonces el selector devolverá un conteo de 2.
  • Si tiene un User con el username "jess" y 3 Users adicionales cada uno con uno de los correos electrónicos dados, el selector devolverá un conteo de 4.


Sí, esto solía ser documentado mejor. Prueba esto:

Username.any_of({:username => @username}, {:email => @email})