в MongoDB подсчитать количество уникальных значений в поле/ключ


есть ли запрос для вычисления, сколько различных значений поле содержит в БД.

f. e у меня есть поле для страны, и есть 8 типов значений стран (Испания, Англия, Франция и т. д...)

Если кто-то добавляет больше документов с новой страной, я хотел бы, чтобы запрос вернул 9.

есть ли более простой способ, то группа и подсчет?

5 52

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}})

надеюсь, что это помогает!