我正在将我的应用程序从Mongoose 2.6.5迁移到3.1.2,我遇到了一些意想不到的行为.即我注意到查询结果自动限制为1000条记录,而其他所有内容的工作方式都相同.在我的代码(下面)中,我设置了一个值maxIvDataPoints,它限制了返回的数据点的数量(并最终发送到客户端浏览器),并且该值在别处设置为1500.我使用计数查询来确定潜在的总数结果,然后是一个后续mod,使用count和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()
解决方法
你被一对相关因素绊倒了:
> Mongoose的默认查询batchSize changed to 1000 in 3.1.2.
> MongoDB有一个known issue,其中一个需要内存中排序的查询将查询批量大小的硬限制放在返回的文档数上.
因此,您可以选择在TestDataPoint上放置一个组合索引,允许mongo在此类查询中使用它进行dataPoint排序,或者将batch size增加到至少是您期望的文档总数.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。