5

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

2 に答える 2

9

次の 2 つの関連する要因によってつまずきます。

  1. Mongoose のデフォルトのクエリ batchSizeは 3.1.2 で 1000 に変更されました
  2. MongoDB には、メモリ内の並べ替えを必要とするクエリによって、返されるドキュメントの数に対するクエリのバッチ サイズのハード リミットが設定されるという既知の問題があります。

したがって、オプションは、モンゴがこのタイプのクエリでTestDataPoint並べ替えに使用できるようにするコンボインデックスを配置するか、バッチサイズを少なくとも予想されるドキュメントの合計数に増やすことです。dataPoint

于 2012-09-28T16:03:37.733 に答える
5

うわーそれはひどいです。近いうちに、batchSize のデフォルトを削除する修正を mongoose に公開します (大きな結果セットをストリーミングするときに役立ちました)。ポインタをありがとう。

更新: 3.2.1 および 2.9.1 が修正と共にリリースされました (batchSize のデフォルトが削除されました)。

于 2012-09-29T00:51:58.710 に答える