Hay una consulta para el cálculo de cuántos valores de un campo contiene en DB.

f.e tengo un campo para el país y que hay 8 tipos de país de valores (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 manera más fácil, a continuación, el grupo y el conde?

InformationsquelleAutor Liatz | 2013-02-17

5 Comentarios

  1. 158

    MongoDB tiene un > distintos comando que devuelve una matriz de valores distintos de un campo, se puede comprobar la longitud de la matriz para un recuento.

    Hay una concha db.de la colección.distintos() helper así:

    > db.countries.distinct('country');
    [ "Spain", "England", "France", "Australia" ]
    
    > db.countries.distinct('country').length
    4
    • esto no funciona si el número de valores distintos que es demasiado alto… si se busca en distintos nombres de personas en el mundo o algo así. ¿tiene usted una respuesta que las escalas?
    • 1+ para la longitud. yo estaba luchando para encontrar algo así. Gracias.
    • No sé por qué no usar count() no así
    • porque es sólo un array de javascript, que utiliza la propiedad length para contar el número de elementos.
  2. 85

    Aquí es un ejemplo de uso de la agregación de la API. Para complicar el caso que nos estamos agrupando por no distingue mayúsculas de minúsculas palabras de la matriz de la propiedad 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 la

    { "_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 }
    • Iniciado sesión a + esta respuesta. Gracias! por cierto, si usted lo está haciendo en un campo único, acaba de quitar el desenrollado de la línea.
    • es necesaria, porque el código es la agrupación de los valores individuales de una matriz de campo que coincida con la forma en distinct obras.
    • lo de Richie dijo es que si la agrupación se hace sólo «regular» de campo (string, int, etc.) entonces usted no necesita relajarse paso. ¿No es correcta?
    • es necesario cuando se trabaja con matrices.
    • +1 para la respuesta, exactamente lo que yo estaba trabajando, sin embargo distinta, tiene su propio encanto, pero esto es sólo el oro 🙂 — de todos modos tengo que leer más acerca de los agregados para lograr la deseada conjunto de resultados para filtrar los datos
  3. 12

    Con MongoDb 3.4.4 y posterior, usted puede aprovechar el uso de $arrayToObject operador y un $replaceRoot tubería para obtener la cuenta.

    Por ejemplo, suponga que tiene un conjunto de usuarios con diferentes roles y desea calcular los distintos cargos de los roles. Tendría que ejecutar el siguiente agregado canalización:

    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
    }
    • Esta no es la respuesta a la pregunta, pero es útil, no obstante. Me pregunto cómo esto se realiza en comparación con .distinct().
    • Esto no está funcionando como $papel debe ser una matriz.
  4. 8

    Puede aprovechar en Mongo Shell Extensions. Es una sola .js importar que se puede anexar a su $HOME/.mongorc.js, o mediante programación, si eres de codificación en Node.js/io.js demasiado.

    Muestra

    Para cada valor distinto del campo de los recuentos de las apariciones en los documentos opcionalmente filtrados por consulta

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

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

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

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

    {
      "Austin,Educator" : 1,
      "Aurelia,Educator" : 1,
      "Augustine,Carpenter" : 1,
      ...
    }
    • ¿cómo puedo importar esta en el nodo?
    • require("./script.js"), supongo
    • a la derecha, pero yo no era capaz de obtener las funciones en el interior. ¿Cómo hago uso de ellos. Ellos se definen como db.protoptype.distinctAndCount
    • Hay una sección en la repo del readme (RTFM!1!!1!) básicamente, poner el .mongorc.jsarchivo en tu directorio local. Hecho.
  5. 4

    Encontrar distintos en field_1 en la colección, pero queremos que algunos WHERE condición también de lo que podemos hacer como los siguientes :

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

    Así, encontrar el número distintas names a partir de una colección donde la edad > 25 serán como :

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

    Espero que ayude!

Dejar respuesta

Please enter your comment!
Please enter your name here