5

我正在将我的应用程序从 Mongoose 2.6.5 迁移到 3.1.2,并且遇到了一些意外行为。也就是说,我注意到查询结果自动限制为 1000 条记录,而几乎所有其他内容都一样。在我的代码(如下)中,我设置了一个maxIvDataPoints限制返回的数据点数量(并最终发送到客户端浏览器)的值,该值在其他地方设置为 1500。我使用计数查询来确定潜在结果的总数,然后一个后续的mod来限制实际的查询结果,使用count和valuemaxIvDataPoints来确定mod的值。我正在运行节点 0.8.4 和 mongo 2.0.4,用 coffeescript 编写服务器端代码。

在安装 mongoose 3.1.x 之前,代码按我的意愿运行,每次返回不到 1500 个数据点。安装 3.1.2 后,我每次都返回 1000 个数据点(假设指定范围内有 1000 多个数据点)。结果被截断,因此数据点 1001 到 ~1500 是不再返回的数据点。

似乎某处可能有一些设置可以控制这种行为,但我在文档、此处或 Google 组中找不到任何内容。我仍然是一个相对的 n00b,所以我可能错过了一些明显的东西。

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

2 回答 2

9

你被两个相关的因素绊倒了:

  1. Mongoose 的默认查询 batchSize在 3.1.2 更改为 1000
  2. MongoDB 有一个已知问题,即需要内存排序的查询对返回的文档数量设置了查询批处理大小的硬限制。

因此,您的选择是放置一个组合索引TestDataPoint,允许 mongodataPoint在此类查询中使用它进行排序,或者将批量大小增加到至少您期望的文档总数。

于 2012-09-28T16:03:37.733 回答
5

哇,太可怕了。我将很快发布对 mongoose 的修复,删除 batchSize 默认值(在流式传输大型结果集时很有帮助)。感谢您的指点。

更新:3.2.1 和 2.9.1 已随修复程序一起发布(删除了默认的 batchSize)。

于 2012-09-29T00:51:58.710 回答