【问题标题】:Most common distinct values mongodb最常见的不同值 mongodb
【发布时间】:2014-06-17 15:07:12
【问题描述】:

如何在查询结果中获取键的最常见的不同值。

考虑一个集合'collectionSample'

{
    name : 'a',
    value: 10,
    word : 'baz'
},
{
    name : 'a',
    value: 65,
    word : 'bar'
},
{
    name : 'a',
    value: 3,
    word : 'foo'
},
{
    name : 'b',
    value: 110,
    word : 'bar'
},
{
    name : 'b',
    value: 256,
    word : 'baz'
}

这里我想找到键'name'的模式,即重复次数最多的不同'name'。

我希望得到的结果是这样的

 {'most_common_distinct_val':a}  //since a is count 3 and b is count 2

NodeJs mongo客户端如何查询?

【问题讨论】:

    标签: node.js mongodb mongodb-query


    【解决方案1】:

    2017-08-01 更新

    作为 MongoDB 3.4 的发布,以下代码可以使用$sortByCount 进行简化,它本质上等于$group + $sort。代码sn-p:

    col.aggregate([{
        "$sortByCount": "$name"
    }], ...);
    

    mongodb aggregation framework 可以完成这项工作。代码示例:

    var MongoClient = require("mongodb").MongoClient;
    MongoClient.connect("mongodb://localhost/YourDB", function(err, db) {
        var col = db.collection("YourCol");
        col.aggregate([{
            "$group": {_id: "$name", count: { "$sum": 1}}
        }, {
            "$sort": {count: -1}
        }], function(err, docs) {
            var keys = []
            docs.forEach(function(doc) {
                console.log(JSON.stringify(doc)); // do what you want here.
            });
        });
    });
    

    聚合框架使用不同的“过滤器”来过滤掉结果集。正如您在示例中看到的那样,有一个包含所有这些过滤器的数组。
    这里我有 2 个过滤器,第一个:

    {"$group": {_id: "$name", count: { "$sum": 1}}}
    

    是按名称对数据进行分组并计算重复次数。
    第二个:

    {"$sort": {count: -1}}
    

    是按重复次数(计数)对结果进行排序。
    如果你只想要最大重复的一条记录,你可以在那里添加一个过滤器:

    {"$limit": 1}
    

    您可以使用该框架做更多的事情。参考文档operators

    【讨论】:

    • 这只是按名称分组的权利。我想得到{'most_common_distinct_val':a}这样的结果
    • 你的意思是你想知道这些名字重复了多少次?
    • 不,我想知道哪个值重复次数最多
    • 我编辑我的答案以显示如何计算重复次数,并按此排序。
    • 在我的回答中添加一些关于它是如何工作的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 2021-09-18
    • 1970-01-01
    相关资源
    最近更新 更多