0

私は現在、couchdb から mongodb に移行していますが、まだこのことを学んでおり、Web ページで並べ替えを使用してクエリを実行するたびに問題が発生します。フレームワークとして codeigniter を使用し、mongodb php ライブラリにalexbilbie lib を使用しています。

だから、ここに私の問題があります:私は、毎秒更新される部屋のセンサーからクエリを実行し(したがって、コレクションにすでに数千のドキュメントを保存しています)、モデルからこのクエリを使用する最新のセンサー値を取得するつもりです:

function mongoGetDocLatestDoc($sensorid){
    $doc = $this->mongo_db->where(array('SensorId'=>$sensorid))->limit(1)->order_by(array('_id'=>'DESC'))->get('my_mongo');
    return $doc;

}

コントローラーでこれを呼び出した場合、クエリの処理に多くの時間がかかり、タイムスタンプによる並べ替えを変更するとさらに悪化します。同じページでこのクエリを必要とする 10 個を超えるセンサーがあることは言うまでもなく、2 番目のセンサーに対してこれを再度呼び出すたびに、レイテンシーが 2 倍になります。私はそれを間違っていますか、それともコレクションから最新のデータを取得するためのより効率的な方法がありますか?

編集:@Sammaye:あなたの提案に基づいてインデックスを作成しようとしましたが、クエリを実行した後に生成された説明は次のとおりです。

"cursor" : "BtreeCursor timestamp_desc",
    "nscanned" : 326678,
    "nscannedObjects" : 326678,
    "n" : 50,
    "millis" : 4402,
    "nYields" : 7,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {
            "timestamp" : [
                    [
                            {
                                    "$maxElement" : 1
                            },
                            {
                                    "$minElement" : 1
                            }
                    ]
            ]
    }

比較によると、これはインデックスを使用せずに最初のクエリを説明します(より高速に実行されました):

"cursor" : "BasicCursor",
    "nscanned" : 385517,
    "nscannedObjects" : 385517,
    "n" : 50,
    "millis" : 1138,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {

    }
4

1 に答える 1