多くのドキュメント(> 100M)をクエリする必要があり、5000ドキュメント(それぞれ4-5MB)のバッチで要求しています。 何らかの理由により、 の残りがかなりの時間(〜8〜9.5秒)かかる間、最初の要求(_id
フィルタリングなし)はすぐに戻ります(〜1.5s)。最初の読み込み後にMongoDBの読み込みが遅くなる
500個のドキュメント(それぞれ~500kB)のバッチを読み込むと、タイミングが大幅に改善され(約0.5-0.8秒)、すべてのリクエストで一貫しています。
私がskip + limit
メソッドがはるかに悪化しているのを見て、_id + limit
ページネーションの方法を使用しています。
ここに私のプロセスのサンプルがあります。
var mongodb = require("mongodb")
var bytes = require("bytes")
...
var filter = {
'_id': { '$gt': this._lastId }
}
if(mongodb.ObjectId.isValid(this._lastId)) {
filter['_id'] = { '$gt': this._lastId }
}
var cursor = this.conn.collection(collectionName)
.find(filter)
.limit(5000)
var start = new Date().getTime()
cursor.toArray(function(err, docs) {
if (err) { ... }
var elapsed = (new Date().getTime() - start)/1000
console.log(
"Docs:", docs.length,
"Size:", bytes(sizeof(docs)),
"Took:", elapsed + " seconds"
)
var lastDoc = docs[docs.length - 1]
this._lastId = lastDoc._id
})
...
バッチサイズが250〜500の場合は、最良の結果が得られます。 5000のバッチはあまりにも多く、MongoDBドライバは内部的に1000の最大サイズにそれを分解します。 – Saleem