2012-09-28 6 views
5

Estoy migrando mi aplicación de Mongoose 2.6.5 a 3.1.2, y me estoy encontrando con algo inesperado comportamiento. A saber, los resultados de la consulta se limitan automáticamente a 1000 registros, mientras que casi todo lo demás funciona de la misma manera. En mi código (a continuación) establezco un valor maxIvDataPoints que limita el número de puntos de datos devueltos (y finalmente enviados al navegador del cliente), y ese valor se estableció en otro lugar en 1500. Utilizo una consulta de recuento para determinar el número total de potenciales resultados, y luego un mod posterior para limitar los resultados de la consulta real utilizando el recuento y el valor de maxIvDataPoints para determinar el valor del mod. Estoy ejecutando el nodo 0.8.4 y mongo 2.0.4, escribiendo el código del lado del servidor en coffeescript.Mangosta que limita la consulta a 1000 resultados cuando quiero más/todo (migración de 2.6.5 a 3.1.2)

Antes de instalar la mangosta 3.1.x, el código funcionaba como yo quería, volviendo a menos de 1500 puntos de datos cada vez. Después de instalar 3.1.2, obtengo exactamente 1000 puntos de datos devueltos cada vez (suponiendo que haya más de 1000 puntos de datos en el rango especificado). Los resultados se truncan, por lo que los puntos de datos 1001 a ~ 1500 son los que ya no se devuelven.

Parece que puede haber alguna configuración en algún lugar que rige este comportamiento, pero no puedo encontrar nada en los documentos, aquí o en el grupo de Google. Todavía soy un n00b relativo, así que puede haber olvidado algo obvio.

DataManager::ivDataQueryStream = (testId, minTime, maxTime, callback) -> 

    # If minTime and maxTime have been provided, set a flag to limit time extents of query 
    unless isNaN(minTime) 
    timeLimits = true 

    # Load the max number of IV data points to be displayed from CONFIG 
    maxIvDataPoints = CONFIG.maxIvDataPoints 

    # Construct a count query to determine the number if IV data points in range 
    ivCountQuery = TestDataPoint.count({}) 
    ivCountQuery.where "testId", testId 

    if timeLimits 
     ivCountQuery.gt "testTime", minTime 
     ivCountQuery.lt "testTime", maxTime 

    ivCountQuery.exec (err, count) -> 

     ivDisplayQuery = TestDataPoint.find({}) 
     ivDisplayQuery.where "testId", testId 

     if timeLimits 
      ivDisplayQuery.gt "testTime", minTime 
      ivDisplayQuery.lt "testTime", maxTime 

     # If the data set is too large, use modulo to sample, keeping the total data series 
     # for display below maxIvDataPoints 
     if count > maxIvDataPoints 
      dataMod = Math.ceil count/maxIvDataPoints 

      ivDisplayQuery.mod "dataPoint", dataMod, 1 

     ivDisplayQuery.sort "dataPoint" #, 1 <-- new sort syntax for Mongoose 3.x 
     callback ivDisplayQuery.stream() 

Respuesta

9

que está obteniendo disparado por un par de factores relacionados:

  1. consulta predeterminada de la mangosta batchSize changed to 1000 in 3.1.2.
  2. MongoDB tiene un known issue donde una consulta que requiere una ordenación en memoria pone un límite estricto del tamaño del lote de la consulta en la cantidad de documentos devueltos.

Así que sus opciones son para poner un índice combinado de TestDataPoint que permitiría mongo usarlo para clasificar por dataPoint en este tipo de consulta o aumentar el batch size a por lo menos el número total de documentos se está esperando.

+0

Gracias! Eso es muy útil. De hecho, lo tengo en mi lista de problemas para implementar índices en TestDataPoint. Iba a crear uno que fuera '{testId: 1, dataPoint: 1}' y otro '{testId: 1, testTime: 1, dataPoint: 1}', principalmente para acelerar las consultas en la función anterior. Pero según lo que dices, parece que permitirán el tipo que mencionas. ¿Es eso correcto? También parece bastante trivial establecer el tamaño del lote en mi valor de 'maxIvDataPoints'. ¿Hay algún inconveniente para hacer eso? – Eli

+0

@BRValentine Sí, deberían hacerlo, pero use ['explain'] (www.mongodb.org/display/DOCS/Explain) para confirmar que una consulta utiliza el índice que está esperando. Y sí, establecer el tamaño del lote es fácil, con el único inconveniente de un breve aumento en la demanda de memoria. – JohnnyHK

4

Wow eso es horrible. Voy a publicar una solución para mangosta y pronto eliminaré el valor por defecto de batchSize (fue útil al transmitir grandes conjuntos de resultados). Gracias por el puntero.

ACTUALIZACIÓN: 3.2.1 y 2.9.1 han sido liberados con la corrección (eliminado batchSize por defecto).

Cuestiones relacionadas