最常见的不同价值观mongodb

时间:2014-05-01 05:34:24

标签: node.js mongodb mongodb-query

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

考虑一个集合'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客户端中查询它?

1 个答案:

答案 0 :(得分:11)

2017-08-01更新

作为MongoDB 3.4的发布版,使用$sortByCount可以简化以下代码,该代码基本上等于$group + $sort。代码段:

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

的文档