是否存在用于计算字段在DB中包含多少个不同值的查询。
f.e我有一个国家的领域,有8种国家价值观(西班牙,英格兰,法国等......)
如果有人在新国家/地区添加了更多文档,我希望查询返回9。
那么分组和计数是否更简单?
答案 0 :(得分:154)
MongoDB有一个distinct
command,它返回一个字段的不同值数组;你可以检查一下数组的长度。
还有一个shell db.collection.distinct()
帮助器:
> db.countries.distinct('country');
[ "Spain", "England", "France", "Australia" ]
> db.countries.distinct('country').length
4
答案 1 :(得分:81)
以下是使用聚合API的示例。为了使案例复杂化,我们使用来自文档数组属性的不区分大小写的单词进行分组。
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 }
答案 2 :(得分:12)
使用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
}
答案 3 :(得分:8)
您可以利用Mongo Shell Extensions。如果您在Node.js / io.js中进行编码,则可以将单个.js导入附加到$HOME/.mongorc.js
或以编程方式附加。
<强>示例强>
对于字段计数的每个不同值,可选择按查询
过滤的文档中的出现次数&GT;
db.users.distinctAndCount('name', {name: /^a/i})
{
"Abagail": 1,
"Abbey": 3,
"Abbie": 1,
...
}
字段参数可以是字段数组
&GT;
db.users.distinctAndCount(['name','job'], {name: /^a/i})
{
"Austin,Educator" : 1,
"Aurelia,Educator" : 1,
"Augustine,Carpenter" : 1,
...
}
答案 4 :(得分:4)
要在集合field_1
中找到不同的内容,但我们还需要一些WHERE
条件,而不是我们可以执行以下操作:
db.your_collection_name.distinct('field_1', {WHERE condition here and it should return a document})
因此,请从年龄为&gt;的集合中查找不同的names
号码。 25将如下:
db.your_collection_name.distinct('names', {'age': {"$gt": 25}})
希望它有所帮助!
答案 5 :(得分:3)
我想要一个更简洁的答案,我使用 aggregates and group
上的文档想出了以下内容db.countries.aggregate([{"$group": {"_id": "$country", "count":{"$sum": 1}}])
答案 6 :(得分:0)
我使用以下查询:
var collection = "countries"; var field = "country";
db[collection].distinct(field).forEach(function(value){print(field + ", " + value + ": " + db.hosts.count({[field]: value}))})
输出:
countries, England: 3536
countries, France: 238
countries, Australia: 1044
countries, Spain: 16
此查询首先区分所有值,然后为每个值计数出现的次数。