2010-01-05 12 views
35

Tengo un documento incrustado que rastrea las membresías de grupos. Cada documento incrustado tiene una ID que apunta al grupo en otra colección, una fecha de inicio y una fecha de vencimiento opcional.Consulta de MongoDB con una condición 'o'

Deseo consultar a los miembros actuales de un grupo. "Actual" significa que la hora de inicio es menor que la hora actual, y el tiempo de caducidad es mayor que el tiempo actual O nulo.

Esta consulta condicional me está bloqueando por completo. Podría hacerlo ejecutando dos consultas y fusionando los resultados, pero eso parece feo y requiere cargar todos los resultados a la vez. O podría predeterminar el tiempo de caducidad a una fecha arbitraria en el futuro lejano, pero parece incluso más feo y potencialmente frágil. En SQL, simplemente lo expresaría con "(expira> = Ahora()) O (expira IS NULL)" - pero no sé cómo hacer eso en Mongo.

¿Alguna idea? Muchas gracias de antemano.

+0

pregunta análoga: http://stackoverflow.com/questions/1945577/logical-or-for-two-different-fields-in-where-queries-in-mongodb –

Respuesta

2

Query objects in Mongo by default AND expressions together. Mongo currently does not include an OR operator for such queries, however there are ways to express such queries.

uso "en" o "donde".

que va a ser algo como esto:

db.mycollection.find({ $where : function() { 
return (this.startTime < Now() && this.expireTime > Now() || this.expireTime == null); } }); 
+0

¡Genial, la primera vez que veo una función utilizada con Mongo! La desventaja, por supuesto, supongo, es que no usará los índices – Nico

1

El uso de un $ consulta donde será lenta, en parte porque no se puede utilizar índices. Para este tipo de problema, creo que sería mejor almacenar un valor alto para el campo "expira" que, naturalmente, siempre será mayor que ahora(). Puede almacenar una fecha muy alta de millones de años en el futuro, o usar un tipo de seporate para indicar nunca. El orden de clasificación de tipo cruzado se define en http://www.mongodb.org/display/DOCS/Compare+Order+for+Types. Una Regex o MaxKey vacía (si tu idioma lo admite) son buenas opciones.

33

En caso de que alguien lo encuentre útil, www.querymongo.com realiza la traducción entre SQL y MongoDB, incluidas las cláusulas OR. Puede ser realmente útil para descifrar la sintaxis cuando conoces el equivalente SQL.

En el caso de O declaraciones, parece que este

SQL:

SELECT * FROM collection WHERE columnA = 3 OR columnB = 'string'; 

MongoDB:

db.collection.find({ 
    "$or": [{ 
     "columnA": 3 
    }, { 
     "columnB": "string" 
    }] 
}); 
Cuestiones relacionadas