mongodb - create - replica set example
Consulta de MongoDB con una condiciĆ³n ''o'' (4)
Consultar objetos en Mongo por defecto Y expresiones juntas. Mongo actualmente no incluye un operador OR para tales consultas, sin embargo, hay formas de expresar tales consultas.
Use "en" o "dónde".
Va a ser algo como esto:
db.mycollection.find( { $where : function() {
return ( this.startTime < Now() && this.expireTime > Now() || this.expireTime == null ); } } );
Así que tengo un documento incrustado que rastrea las membresías de grupos. Cada documento incrustado tiene una identificación que apunta al grupo en otra colección, una fecha de inicio y una fecha de caducidad opcional .
Quiero 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 bloquea totalmente. 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.
¿Algunas ideas? Muchas gracias de antemano.
Usar una consulta $ where será lento, en parte porque no puede usar í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.
Solo pensé en actualizar en caso de que alguien tropiece con esta página en el futuro. A partir de 1.5.3, mongo ahora es compatible con un $ u operador real: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24or
Su consulta de "(expira> = Ahora ()) O (expira IS NULL)" ahora se puede representar como:
{$or: [{expires: {$gte: new Date()}}, {expires: null}]}
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 las declaraciones OR, parece que esto
SQL:
SELECT * FROM collection WHERE columnA = 3 OR columnB = ''string'';
MongoDB:
db.collection.find({
"$or": [{
"columnA": 3
}, {
"columnB": "string"
}]
});