consulta MongoDB con una 'o' condición
-
18-09-2019 - |
Pregunta
Así que tengo un documento incrustado que rastrea los miembros del grupo. Cada documento incrustado tiene un identificador que apunta al grupo en otra colección, una fecha de inicio, y un opcional fecha de caducidad.
Quiero consultar los actuales miembros de un grupo. "Actual" significa que la hora de inicio es menor que el tiempo actual y el tiempo de expiración es mayor que el tiempo o nula actual.
Esta consulta condicional me está bloqueando por completo. Podría hacerlo mediante la ejecución de dos consultas y la fusión de los resultados, pero que parece fea y requiere de carga en todos los resultados a la vez. O podría defecto, el tiempo de expiración de una fecha arbitraria en el futuro lejano, pero que parece aún más feo y potencialmente frágil. En SQL que acababa de expresar con "(expira> = Now ()) O (vence es nulo)." - pero no sé cómo hacer eso en Mongo
¿Alguna idea? Muchas gracias de antemano.
Solución
Sólo quería actualizar en caso de que alguien se tropieza con esta página en el futuro. A partir de 1.5.3, mongo ahora es compatible con un $ real o del operador: http : //www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24or
A su búsqueda de "(expira> = Now ()) O (vence es nulo)" ahora se puede representar como:
{$or: [{expires: {$gte: new Date()}}, {expires: null}]}
Otros consejos
En caso de que alguien le resulta útil, www.querymongo.com hace la traducción entre SQL y MongoDB, incluyendo cláusulas OR . Puede ser muy útil para averiguar la sintaxis cuando se conoce el equivalente SQL.
En el caso de las declaraciones o, parece que este
SQL:
SELECT * FROM collection WHERE columnA = 3 OR columnB = 'string';
MongoDB:
db.collection.find({
"$or": [{
"columnA": 3
}, {
"columnB": "string"
}]
});
Uso "en" o "donde".
Va a ser algo como esto:
db.mycollection.find( { $where : function() {
return ( this.startTime < Now() && this.expireTime > Now() || this.expireTime == null ); } } );
db.Lead.find (
{"name": {'$regex' : '.*' + "Ravi" + '.*'}},
{
"$or": [{
'added_by':"arunkrishna@aarux.com"
}, {
'added_by':"aruna@aarux.com"
}]
}
);
Con una consulta $where
será lento, en parte porque no se puede utilizar índices. Para este tipo de problema, creo que sería mejor para almacenar un valor alto para el campo "expira" que, naturalmente, ser siempre mayor que ahora (). Usted puede almacenar una fecha muy altas millones de años en el futuro, o usar un tipo separado para indicar que nunca. El orden de clasificación de tipo cruz se define en aquí .
Una expresión regular vacío o MaxKey (si lo admite el lenguaje) son buenas opciones.