在MongoDB中构造计数查询

在MongoDB中构造计数查询,mongodb,nosql,Mongodb,Nosql,我有一个MongoDB数据库,其中的文档如下所示: {"users" : ["u1", "u2", "u3"]} {"users" : ["u1", "u4"]} {"users" : ["u1", "u3", "u5", "u6", "u7"]} 我想获得用户数量较多的文档的计数。使用上述方法,查询将返回5作为数据库中的最高用户计数。我如何在MongoDB中做到这一点 我可以通过以下方式获得特定大小的文档数: db.mydb.find({users: {$size: 5}}).count()

我有一个MongoDB数据库,其中的文档如下所示:

{"users" : ["u1", "u2", "u3"]}
{"users" : ["u1", "u4"]}
{"users" : ["u1", "u3", "u5", "u6", "u7"]}
我想获得用户数量较多的文档的计数。使用上述方法,查询将返回5作为数据库中的最高用户计数。我如何在MongoDB中做到这一点

我可以通过以下方式获得特定大小的文档数:

db.mydb.find({users: {$size: 5}}).count()
但是,我不知道如何在用户数组中的所有文档中找到最大计数


谢谢。

您不能直接在MongoDB中执行此操作。但是,您可以在同一文档中添加一个名为“user_count”的额外字段,并在每次向“users”数组添加新用户时将其递增1

您的更新看起来像:

db.mydb.update({<update_condition>}, {$push :{"users":"u8"}, $inc : {"user_count":1}})
db.mydb.update({},{$push:{“用户”:“u8”},$inc:{“用户计数”:1})

以下是MongoDB中的三种可行解决方案,但ASIA的答案可能更合适,具体取决于您的工程需求。您应该回答以下问题:我的收藏量有多大,每个潜在解决方案的成本/效率是多少?是否存在其他性能问题?我可以通过在问题域中记账来更有效地解决这个问题吗

<>你应该考虑通过应用程序显式地跟踪最大计数,如果这是一个常见的问题。对于用户的增加,您只需跟踪最大值。但是(仅)如果某个文档比当前最大值减少,您必须为完整查询支付成本。ASIA的解决方案可能仍然有助于完成这一完整查询

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

  • db.eval服务器大小代码执行-

    注意:对于长时间运行的作业,请使用map/reduce而不是db.eval()。db.eval阻止其他操作

  • 聚合“组”——

  • 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