以下はMongoDBの3つの実用的なソリューションですが、エンジニアリングのニーズによっては、Asyaの回答の方が適切な場合があります。次のような質問に答える必要があります。私のコレクションの大きさ、および各ソリューションのコスト/効率はどれくらいですか。他にパフォーマンスの問題はありますか?問題の領域で簿記をすることで、これをより効率的に解決できますか?
これが一般的な質問である場合は、アプリケーションを介して最大カウントを明示的に追跡することを検討する必要があります。ユーザーを増やすには、最大数を追跡するだけです。ただし、(のみ)現在の最大値からドキュメントが減少した場合は、完全なクエリのコストを支払う必要があります。Asyaのソリューションは、この完全なクエリに役立つ可能性があります。
これがMongoDBの可能性です。問題とパフォーマンスまたはエンジニアリングへの影響に関して、ドキュメントを注意深く調べてください。
db.evalサーバーサイズのコード実行-http ://www.mongodb.org/display/DOCS/Server-side+Code+Execution
注意:長時間実行されるジョブには、db.eval()の代わりにmap/reduceを使用してください。db.evalは他の操作をブロックします!
アグリゲーション「グループ」-http ://www.mongodb.org/display/DOCS/Aggregation
- MapReduce- http://www.mongodb.org/display/DOCS/MapReduce
count_query.js
db.mydb.drop();
db.mydb.save({"users" : ["u1", "u2", "u3"]});
db.mydb.save({"users" : ["u1", "u4"]});
db.mydb.save({"users" : ["u1", "u3", "u5", "u6", "u7"]});
//printjson(db.mydb.find().toArray());
printjson(db.eval(function() {
var count = 0;
db.mydb.find().forEach( function(doc) {
if (doc.users.length > count)
count = doc.users.length;
});
return count;
}));
printjson(db.mydb.group({
reduce: function(doc, prev) {
if (doc.users.length > prev.count)
prev.count = doc.users.length;
},
initial: {count: 0}
})[0].count);
printjson(db.mydb.mapReduce(
function() { emit(0, {count: this.users.length}); },
function(key, values) {
var result = {count: 0};
values.forEach(function(value) {
if (value.count > result.count)
result.count = value.count;
});
return result;
},
{out: {inline: 1}}
).results[0].value.count);
実行と出力
$ mongo count_query.js
MongoDB shell version: 2.0.4
connecting to: test
5
5
5