如何在查询结果中获取键的最常见的不同值。
考虑一个集合'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客户端中查询它?
答案 0 :(得分:11)
作为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
的文档