mongodb número de valores distintos por campo / clave


Existe una consulta para calcular cuántos valores distintos contiene un campo en DB.

F. e Tengo un campo para país y hay 8 tipos de valores de país (españa, inglaterra, francia, etc...)

Si alguien agrega más documentos con un nuevo país me gustaría que la consulta devuelva 9.

¿Hay una manera más fácil que agrupar y contar?

Author: chridam, 2013-02-17

5 answers

MongoDB tiene un distinct comando que devuelve una matriz de valores distintos para un campo; puede comprobar la longitud de la matriz para un recuento.

Hay un shell db.collection.distinct() ayudante también:

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

> db.countries.distinct('country').length
4
 122
Author: Stennie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-18 02:43:04

Aquí hay un ejemplo de uso de la API de agregación. Para complicar el caso estamos agrupando por palabras insensibles a mayúsculas y minúsculas de la propiedad array del documento.

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

Que dan resultado, tales como

{ "_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 }
 61
Author: expert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-29 15:37:24

Puede aprovechar las extensiones de shell de Mongo. Es una sola .importación js que puede anexar a su $HOME/.mongorc.js, o mediante programación, si está codificando en Nodo.js / io.js también.

Muestra

Para cada valor distinto de campo cuenta las ocurrencias en documentos opcionalmente filtrados por consulta

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

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

El parámetro field podría ser una matriz de campos

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

{
  "Austin,Educator" : 1,
  "Aurelia,Educator" : 1,
  "Augustine,Carpenter" : 1,
  ...
}
 6
Author: evandrix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-13 13:03:24

Con MongoDB 3.4.4 y posteriores, puede aprovechar el uso de $arrayToObject operator and a $replaceRoot pipeline para obtener los recuentos.

Por ejemplo, supongamos que tiene una colección de usuarios con diferentes roles y desea calcular los distintos conteos de los roles. Tendría que ejecutar la siguiente canalización agregada:

db.users.aggregate([
    { 
        "$group": {
            "_id": { "$toLower": "$role" },
            "count": { "$sum": 1 }
        }
    },
    { 
        "$group": {
            "_id": null,
            "counts": {
                "$push": {
                    "k": "$_id",
                    "v": "$count"
                }
            }
        }
    },
    { 
        "$replaceRoot": {
            "newRoot": { "$arrayToObject": "$counts" }
        } 
    }    
])

Ejemplo De Salida

{
    "user" : 67,
    "superuser" : 5,
    "admin" : 4,
    "moderator" : 12
}
 3
Author: chridam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-12 15:35:32

Para encontrar distinto en {[0] } en la colección, pero queremos alguna condición WHERE también de lo que podemos hacer como sigue:

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

Por lo tanto, encontrar el número distinto names de una colección donde la edad > 25 será como:

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

Espero que ayude!

 2
Author: Vimal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-23 05:45:00