是否存在用于计算字段在数据库中包含多少个不同值的查询。
fe我有一个国家/地区字段,并且有8种国家/地区值(西班牙,英国,法国等)。
如果有人在一个新国家/地区添加更多文档,我希望查询返回9。
有没有更简单的方法来分组和计数?
是否存在用于计算字段在数据库中包含多少个不同值的查询。
fe我有一个国家/地区字段,并且有8种国家/地区值(西班牙,英国,法国等)。
如果有人在一个新国家/地区添加更多文档,我希望查询返回9。
有没有更简单的方法来分组和计数?
Answers:
MongoDB有一个distinct
命令,该命令返回字段的不同值的数组;您可以检查数组的长度以进行计数。
还有一个shell db.collection.distinct()
助手:
> db.countries.distinct('country');
[ "Spain", "England", "France", "Australia" ]
> db.countries.distinct('country').length
4
这是使用聚合API的示例。为了使大小写复杂化,我们根据文档的array属性按不区分大小写的单词进行分组。
db.articles.aggregate([
{
$match: {
keywords: { $not: {$size: 0} }
}
},
{ $unwind: "$keywords" },
{
$group: {
_id: {$toLower: '$keywords'},
count: { $sum: 1 }
}
},
{
$match: {
count: { $gte: 2 }
}
},
{ $sort : { count : -1} },
{ $limit : 100 }
]);
给出诸如
{ "_id" : "inflammation", "count" : 765 }
{ "_id" : "obesity", "count" : 641 }
{ "_id" : "epidemiology", "count" : 617 }
{ "_id" : "cancer", "count" : 604 }
{ "_id" : "breast cancer", "count" : 596 }
{ "_id" : "apoptosis", "count" : 570 }
{ "_id" : "children", "count" : 487 }
{ "_id" : "depression", "count" : 474 }
{ "_id" : "hiv", "count" : 468 }
{ "_id" : "prognosis", "count" : 428 }
unwind
是必需的,因为代码正在对与distinct
工作方式匹配的数组字段的各个值进行分组。
unwind
使用数组时,@ guyarad 是必需的。
使用MongoDb 3.4.4和更高版本,您可以利用$arrayToObject
运算符和$replaceRoot
管道的使用来获取计数。
例如,假设您有一个具有不同角色的用户集合,并且您想计算角色的不同数量。您将需要运行以下聚合管道:
db.users.aggregate([
{ "$group": {
"_id": { "$toLower": "$role" },
"count": { "$sum": 1 }
} },
{ "$group": {
"_id": null,
"counts": {
"$push": { "k": "$_id", "v": "$count" }
}
} },
{ "$replaceRoot": {
"newRoot": { "$arrayToObject": "$counts" }
} }
])
示例输出
{
"user" : 67,
"superuser" : 5,
"admin" : 4,
"moderator" : 12
}
.distinct()
。
您可以利用Mongo Shell扩展。这是单个.js导入$HOME/.mongorc.js
,如果您也使用Node.js / io.js进行编码,则可以将其附加到或以编程方式附加。
样品
对于字段的每个不同值,统计文档中的出现次数(可选),通过查询进行过滤
>
db.users.distinctAndCount('name', {name: /^a/i})
{
"Abagail": 1,
"Abbey": 3,
"Abbie": 1,
...
}
field参数可以是一个字段数组
>
db.users.distinctAndCount(['name','job'], {name: /^a/i})
{
"Austin,Educator" : 1,
"Aurelia,Educator" : 1,
"Augustine,Carpenter" : 1,
...
}
require("./script.js")
,我想
.mongorc.js
文件放入您的主目录中。做完了