Mongodb подсчитывает количество различных значений для поля/ключа

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

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

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

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

Ответ 1

MongoDB имеет команду distinct, которая возвращает массив различных значений для поля; вы можете проверить длину массива для подсчета.

Существует вспомогательный файл оболочки db.collection.distinct():

> db.countries.distinct('country');
[ "Spain", "England", "France", "Australia" ]

> db.countries.distinct('country').length
4

Ответ 2

Вот пример использования 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 }

Ответ 3

Вы можете использовать Mongo Shell Extensions. Это один импорт .js, который вы можете добавить в свой $HOME/.mongorc.js или программно, если вы кодируете в Node.js/io.js тоже.

Пример

Для каждого отдельного значения подсчетов полей вхождения в документы, необязательно отфильтрованные по запросу

> db.users.distinctAndCount('name', {name: /^a/i})

{
  "Abagail": 1,
  "Abbey": 3,
  "Abbie": 1,
  ...
}

Параметр поля может быть массивом полей

> db.users.distinctAndCount(['name','job'], {name: /^a/i})

{
  "Austin,Educator" : 1,
  "Aurelia,Educator" : 1,
  "Augustine,Carpenter" : 1,
  ...
}

Ответ 4

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

Ответ 5

Чтобы найти отличительное в field_1 в коллекции, но мы также хотим получить условие WHERE мы можем сделать следующим образом:

db.your_collection_name.distinct('field_1', {WHERE condition here and it should return a document})

Итак, найдите число отличных names из коллекции, где возраст> 25 будет выглядеть так:

db.your_collection_name.distinct('names', {'age': {"$gt": 25}})

Надеюсь, поможет!

Ответ 6

db.collectionName.distinct("fieldName").length

будет работать наверняка

В моем случае это сработало. в настоящее время подсчитываются и выделяются вместе в MongoDB.