これは私の問題を再現する例です:
コレクションに次のような100万のドキュメントを入力します。
for(i=1; i<=1000000; i++){
if(i%3===0)
db.numbers.insert({_id:i, stuff:"Some data", signUpDate: new Date()});
else
db.numbers.insert({_id:i, stuff:"Some data"});
}
したがって、3番目のドキュメントごとにsignUpDateがあります
次のインデックスを作成します。
db.numbers.ensureIndex({"signUpDate" : 1});
次に、nodejsを使用した次の非常に小さなアプリがあります。
var Db = require('mongodb').Db
, Connection = require('mongodb').Connection
, Server = require('mongodb').Server
, format = require('util').format;
var host = 'localhost';
var port = Connection.DEFAULT_PORT;
console.log("Connecting to " + host + ":" + port);
Db.connect(format("mongodb://%s:%s/test?w=1", host, port), function(err, db) {
var collection = db.collection('numbers');
collection.find({'signedUp': true}, {'_id':1}).limit(100000).toArray(function(err, docs){
console.log(docs.length)
});
});
これは正常に機能します。
ただし、を削除する .limit(100000)
と、サーバーはそこにとどまり、応答しなくなります。
一言で言えば、私がやろうとしているのは、signUpDateがnullではない_idのリストを返すことだけです(約333,000あるはずです)
問題はmongodbがキャッシュする方法であると確信していますが、これを回避する方法がわかりません。