以下是 MongoDB 中的三个工作解决方案,但 Asya 的答案可能更合适,具体取决于您的工程需求。您应该回答以下问题:我的收藏有多大,每种潜在解决方案的成本/效率是多少?还有其他性能问题吗?我可以通过在问题域中记账来更有效地解决这个问题吗?
如果这是一个常见问题,您应该考虑通过您的应用程序显式跟踪最大计数。为了增加用户,您只需跟踪最大值。但是(仅)如果文档从当前最大值减少,您必须支付完整查询的费用。Asya 的解决方案可能仍然有助于完成这个完整的查询。
这是 MongoDB 的可能性。请根据您的问题和性能或工程影响仔细检查文档。
db.eval 服务器大小的代码执行 - http://www.mongodb.org/display/DOCS/Server-side+Code+Execution
注意:对于长时间运行的作业,请使用 map/reduce 而不是 db.eval()。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