アプリを Mongoose 2.6.5 から 3.1.2 に移行していますが、予期しない動作が発生しています。つまり、クエリ結果が自動的に 1000 レコードに制限されていることに気付きましたが、他のほとんどすべては同じように機能します。私のコード (以下) では、maxIvDataPoints
返される (そして最終的にクライアント ブラウザーに送信される) データ ポイントの数を制限する値を設定し、その値は別の場所で 1500 に設定されています。カウント クエリを使用して、潜在的な結果の総数を決定します。 、およびその後の mod で、カウントと値を使用して実際のクエリ結果を制限し、maxIvDataPoints
mod の値を決定します。node 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()