2010-10-04 15 views
5

Necesito escribir una consulta MongoDB del formulario "A OR B OR (C AND D)" para devolver algunos registros. Estamos utilizando Mongoid para el acceso de datos a nuestros modelos.¿Cómo se escriben las consultas "(A o B) Y (A o C)" con Mongoid?

amplié esa consulta a "(A o B o C) y (A o B o D)" y tenía la esperanza de que con el método Criterios de Mongoid any_of así: Model.any_of(A, B, C).any_of(A, B, D) podría lograr lo que quiero, sino que se expande como "A O B O C O A O B O D" antes de ser enviado a la base de datos.

¿Hay alguna manera de crear esta consulta, o tengo que crear una consulta para hacer A o B y otra para hacer C y D y tomar la unión de ellos?

Respuesta

0

Comprobar este enlace, espero que podría ayudarle -

http://mongoid.org/docs/querying/

Probablemente, si es posible, se pueden combinar ".any_in" y ".y" y echa un vistazo.

0

Parece que esto es un error en mongo, pero estoy teniendo un momento difícil para averiguar dónde se informan/registran los problemas de mongo.

> db.things.insert({x : 1, y: 2}); 
> db.things.insert({x : 2, y: 3}); 
> db.things.insert({x : 3, y: 4}); 
> db.things.find({ $or : [{x:1,x:2}], $or : [{y:1,y:2}] }); 
{ ..., "x" : 1, "y" : 2 } 
{ ..., "x" : 2, "y" : 3 } 
+1

Múltiples 'o' $ declaraciones no tiene ningún sentido Piensa en lo que será cuando se convierta en un objeto BSON. Este último anulará el primero. Además, sus documentos de selector son culpables de la misma falla; básicamente estás buscando '$ o: [{y: 2}]' allí. –

+0

Múltiples declaraciones '$ o' tienen perfecto sentido, es solo que aparentemente no son compatibles con mongo (¿hay un enlace para verificar esto, por cierto?). Parece que la mejor práctica es convertir manualmente las conjunciones de la forma '(A O B) AND (A o C)' en disyunciones como 'A OR (B AND C)' para usar '$ o', ya que mongoid no hará esto por nosotros. –

+0

Tiene sentido en el sentido lógico booleano, pero no en el sentido del objeto JSON, que no permite claves duplicadas. Tiene razón en que el DNF es la forma correcta de expresar la consulta. –

3

(Edit: acabo de dar cuenta a esta pregunta es de 3 años de edad no tengo idea de por qué se acaba de aparecer..)

quieres algo como esto:

Model.any_of(a, b, c) 

Dónde a , b y c son documentos de selector (que, recuerde, son ANDed con varias cláusulas).

Por ejemplo, si sus preguntas son:

{a: 1} 
{b: 1} 
{c: 1, d: 1} 

A continuación, se debería utilizar:

Model.any_of({a: 1}, {b: 1}, {c: 1, d: 1}) 

Esto generaría una consulta como:

models.find({$or: [{a: 1}, {b: 1}, {c: 1, d: 1}]}) 
+0

Comencé una recompensa en esta pregunta porque es una buena pregunta sin buenas respuestas. – Andrew

+0

Aja, lo tengo. Bueno, espero que el mío sea satisfactorio. :) –

+0

¿Cómo '' any_of' te da '(A O B) AND (A O C)' aquí? –

Cuestiones relacionadas