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.

¿Fue útil?

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"
    }]
});

Objetos de la consulta en Mongo por defecto y expresiones juntos. Mongo actualmente no incluye un operador OR para este tipo de consultas, sin embargo, hay maneras de expresar este tipo de consultas.

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top