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()
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
@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