2012-06-05 45 views
0

我有MongoDB数据库有看起来像这样的文件:建构数查询MongoDB中

{"users" : ["u1", "u2", "u3"]} 
{"users" : ["u1", "u4"]} 
{"users" : ["u1", "u3", "u5", "u6", "u7"]} 

我想获得与用户数量较大的文件的数量。使用上述方法,查询将返回5作为数据库中的最高用户数。我如何在MongoDB中执行此操作?

我能得到的文档的数量与具体尺寸:

db.mydb.find({users: {$size: 5}}).count() 

但是,我想不出如何将用户阵列中的所有文件中找到的最大计数。

谢谢。

回答

2

你不能直接在MongoDB中这样做。但是,您可以在同一个文档中添加一个名为“user_count”的额外字段,并在每次将新用户添加到“users”数组时将其增加1。

您的更新会看起来像:

db.mydb.update({<update_condition>}, {$push :{"users":"u8"}, $inc : {"user_count":1}}) 
0

下面是MongoDB的三个工作方案,但阿霞的回答可能更合适,这取决于你的工程需要。您应该回答如下问题:我的收藏有多大?每种潜在解决方案的成本/效率如何?还有其他性能问题吗?我可以通过在问题领域保留书籍来更高效地解决此问题吗?

如果这是一个常见问题,您应该考虑通过您的应用程序明确跟踪最大计数。为了增加用户,你只需跟踪最大值。但是(仅)如果文档从当前最大值减少,则必须支付完整查询的费用。 Asya的解决方案可能仍然有助于完整查询。

这里是MongoDB的可能性。请仔细检查有关您的问题和性能或工程影响的文档。

  1. db.eval服务器大小的代码执行 - http://www.mongodb.org/display/DOCS/Server-side+Code+Execution

    警告:改用的map/reduce db.eval()长时间运行的工作。 db.eval阻止其他操作!

  2. 聚合 “基团” - http://www.mongodb.org/display/DOCS/Aggregation

  3. 的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