0

次のように、2 つのコレクションがあります。

db.ships
ドキュメント形式: { mmsi: Long, ...いくつかの他のフィールド }
インデックス: { {mmsi: 1}, {unique: true} }

db.navUpdates
ドキュメント形式: { mmsi: Long、時間: ISODate、...その他のフィールド }
インデックス: { mmsi: 1 }、{ 時間: 1 }

内の各ドキュメントについて、 内で一致するdb.ships最新のドキュメントを見つける必要があります。ドキュメントは必ずしも時系列 (timestamp で定義) で入力されているとは限らないため、最新のものを検索するために使用することはできません。db.navUpdatesmmsi_idtime

例えば:

ship document:
{ mmsi: 12345 }

navUpdate documents:
{ mmsi: 12345, time: ISODate("2012-09-19T12:00:00.000Z") }
{ mmsi: 12345, time: ISODate("2012-09-18T12:00:00.000Z") }
{ mmsi: 54321, time: ISODate("2012-09-19T12:00:00.000Z") }

したがって、shipwithmmsi:12345の場合、最新のnavUpdateものは上記のリストの最初のドキュメントである withtime:ISODate("2012-09-19T12:00:00.000Z")です。

次の mongo シェル スクリプトを試してみましたが、信じられないほど遅く (わずか 10 個のクエリで数秒)、サーバーに表示されるメッセージは、インデックスが見つからないことを示しています

db.ships.find().limit(10).forEach(function(ship) {
    var n = db.navUpdates.find({mmsi:ship.mmsi}).count();
    if (n==0) { return; }
    var t = db.navUpdates.find({mmsi:ship.mmsi}).sort({time:-1}).limit(1)[0].time;
    print(t);
});

このクエリが遅いのはなぜですか? おそらく が原因ではないかと考えて、 に{time: -1}インデックスを追加しようとしましたが、それでも改善されません。navUpdatesort({time: -1})

また、このクエリを最適化できますか? 内にが見つからないドキュメントcount()がいくつかあるため、そこに呼び出しがあります。shipmmsinavUpdates

4

1 に答える 1

2

1 つのクエリでは 1 つのインデックスしか使用できないため、検索と並べ替えの両方のニーズに使用できる複合インデックス{ mmsi: 1, time: -1 } を追加する必要があります。navUpdates

次に.explain()、インデックスがクエリで使用されているかどうかを判断するために使用します。

于 2012-09-19T21:08:34.037 に答える