次のように、2 つのコレクションがあります。
db.ships
ドキュメント形式: { mmsi: Long, ...いくつかの他のフィールド }
インデックス: { {mmsi: 1}, {unique: true} }
db.navUpdates
ドキュメント形式: { mmsi: Long、時間: ISODate、...その他のフィールド }
インデックス: { mmsi: 1 }、{ 時間: 1 }
内の各ドキュメントについて、 内で一致するdb.ships
最新のドキュメントを見つける必要があります。ドキュメントは必ずしも時系列 (timestamp で定義) で入力されているとは限らないため、最新のものを検索するために使用することはできません。db.navUpdates
mmsi
_id
time
例えば:
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") }
したがって、ship
withmmsi: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}
インデックスを追加しようとしましたが、それでも改善されません。navUpdate
sort({time: -1})
また、このクエリを最適化できますか? 内にが見つからないドキュメントcount()
がいくつかあるため、そこに呼び出しがあります。ship
mmsi
navUpdates