2011-06-18 19 views
11

¿Es posible expresar la siguiente consulta SQL en mongodb:mongodb encontrar mediante la comparación de valores de campo

SELECT * FROM table AS t WHERE t.field1 > t.filed2; 

edición: En resumen :.

  1. usando un tercer campo que almacena "campo1 - campo2" es casi perfecto, pero requiere un poco de mantenimiento adicional.
  2. $ donde cargará y evaluará en JavaScript y no usará ningún índice. No es bueno para datos grandes.
  3. map/reduce tiene el mismo problema y pasar por sólo todos los registros, incluso si solo necesitamos una
+0

No quiero iniciar una guerra de mensajes, pero Dios mío, odio NoSQL tanto. – Blago

+1

y luego no lo use si no sabe dónde y cómo usarlo correctamente. ¡NoSQL NO es un reemplazo para las bases de datos relacionales! –

+0

Esta es la fuente de mi frustración. La mayoría de las personas se refieren a ella como si fuera un reemplazo. Veo más y más comparaciones a lo largo de las líneas de almacenes de datos antiguos (relacionales) versus modernos (no SQL). – Blago

Respuesta

17

Usted puede hacer esto utilizando $where:

db.coll.find({ $where: "this.field1 > this.field2" }); 

Pero:

Javascript ejecuta más lentamente que los operadores nativos, pero es muy flexible

Si el rendimiento es un problema mejor para ir con la forma sugerida por @yi_H.

+1

Usar $ donde nunca es recomendable. ¡La respuesta de yi_H es la correcta! –

+3

@Sentinel: ¿Has leído mi respuesta hasta el final antes de votar? ????? Dije que javascript funcionaba lento y mejor para crear un campo adicional como @yi_H sugirió. Pero de cualquier manera $ donde exista el operador, estoy absolutamente seguro de que se puede usar en algunas situaciones cuando el rendimiento no se produce. –

+2

Use esto solo si tiene una colección pequeña o filtra previamente la colección con otras condiciones (que usan índices y devuelven un pequeño subconjunto de la colección). Mongo no tiene idea de cómo acelerar esta consulta y ejecutará un escaneo completo de la tabla. –

15

podría almacenar en su documento field1 - field2 como field3, a continuación, buscar { field3: { $gt: 0 } }

También es posible obtener documentos que coincidan con mapreduce.

+7

Debería haber mencionado que puede almacenar el valor booleano, que es mejor en cuanto al rendimiento. –

3

Puede usar un $ donde. Solo tenga en cuenta que será bastante lento (tiene que ejecutar el código Javascript en cada registro) así que combine con las consultas indexadas si puede.

db.T.find({ $where: function() { return this.Grade1 > this.Grade2 } }); 

o más compacta:

db.T.find({ $where : "this.Grade1 > this.Grade2" }); 
Cuestiones relacionadas