微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当我想要更多/全部时,猫鼬将查询限制为1000个结果从2.6.5迁移到3.1.2

如何解决当我想要更多/全部时,猫鼬将查询限制为1000个结果从2.6.5迁移到3.1.2

您会被以下两个相关因素绊倒:

  1. 猫鼬的查询batchSize 在3.1.2中更改为1000
  2. MongoDB存在一个已知问题,即需要进行内存排序的查询对返回的文档数施加了硬性限制,即查询的批处理大小。

因此,您的选择是在该索引上放置一个组合索引TestDataPoint,以使mongo可以dataPoint在此类型的查询中使用该索引进行排序,或者将批处理大小增加到至少所需的文档总数。

解决方法

我正在将我的应用程序从Mongoose
2.6.5迁移到3.1.2,并且遇到了一些意外行为。也就是说,我注意到查询结果自动被限制为1000条记录,而几乎所有其他功能都相同。在下面的代码中,我设置了一个值maxIvDataPoints,该值限制了返回(最终发送到客户端浏览器)的数据点的数量,并且该值在其他位置设置为1500。我使用一个计数查询来确定潜在结果的总数,然后再使用一个mod来限制实际查询结果,该计数使用count和value
maxIvDataPoints来确定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()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。