в MongoDB подсчитать количество уникальных значений в поле/ключ
есть ли запрос для вычисления, сколько различных значений поле содержит в БД.
f. e у меня есть поле для страны, и есть 8 типов значений стран (Испания, Англия, Франция и т. д...)
Если кто-то добавляет больше документов с новой страной, я хотел бы, чтобы запрос вернул 9.
есть ли более простой способ, то группа и подсчет?
5 ответов:
MongoDB имеет
distinct
команда который возвращает массив уникальных значений для поля, вы можете проверить длину массива для графа.раковина
db.collection.distinct()
помощник, а также:> db.countries.distinct('country'); [ "Spain", "England", "France", "Australia" ] > db.countries.distinct('country').length 4
вот пример использования aggregation 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 }
вы можете использовать на Расширения Оболочки Монго. Это сингл .Яш импорт, что вы можете добавить в свой
$HOME/.mongorc.js
, или программно, если вы кодируете в узел.js / io.Яш тоже.пример
для каждого отдельного значения поля подсчитываются вхождения в документах, необязательно отфильтрованных по запросу
>
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, ... }
С 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 }
чтобы найти различные в
field_1
в коллекции, но мы хотим немногоWHERE
состоянии, чем мы можем сделать как ниже :
db.your_collection_name.distinct('field_1', {WHERE condition here and it should return a document})
Итак, найдите число distinct
names
из коллекции, где возраст > 25 будет так :
db.your_collection_name.distinct('names', {'age': {"$gt": 25}})
надеюсь, что это помогает!