Existe uma consulta para calcular quantos valores distintos um campo contém no banco de dados.
fe Eu tenho um campo para país e existem 8 tipos de valores de país (espanha, inglaterra, frança, etc ...)
Se alguém adicionar mais documentos com um novo país, gostaria que a consulta retornasse 9.
Existe uma maneira mais fácil de agrupar e contar?
Respostas:
MongoDB tem um
distinct
comando que retorna uma matriz de valores distintos para um campo; você pode verificar o comprimento da matriz para uma contagem.Também existe um
db.collection.distinct()
auxiliar de shell :fonte
Aqui está um exemplo de uso da API de agregação. Para complicar o caso, estamos agrupando por palavras que não diferenciam maiúsculas de minúsculas da propriedade de array do documento.
que dão resultados como
fonte
unwind
é necessário porque o código está agrupando valores individuais de um campo de array que corresponde a comodistinct
funciona.unwind
é necessário ao trabalhar com matrizes.Com o MongoDb 3.4.4 e mais recente, você pode aproveitar o uso de um
$arrayToObject
operador e um$replaceRoot
pipeline para obter as contagens.Por exemplo, suponha que você tenha uma coleção de usuários com funções diferentes e gostaria de calcular as contagens distintas das funções. Você precisaria executar o seguinte pipeline agregado:
Exemplo de saída
fonte
.distinct()
.Você pode aproveitar as extensões do Mongo Shell . É uma única importação .js que você pode anexar ao seu
$HOME/.mongorc.js
, ou programaticamente, se estiver codificando em Node.js / io.js também.Amostra
Para cada valor distinto de campo conta as ocorrências em documentos opcionalmente filtrados por consulta
O parâmetro de campo pode ser uma matriz de campos
fonte
require("./script.js")
, suponho.mongorc.js
arquivo em seu diretório inicial. Feito.Para encontrar distintos na
field_1
coleção, mas também queremos algumaWHERE
condição do que podemos fazer como segue:db.your_collection_name.distinct('field_1', {WHERE condition here and it should return a document})
Portanto, encontre um número diferente
names
de uma coleção em que idade> 25 será como:db.your_collection_name.distinct('names', {'age': {"$gt": 25}})
Espero que ajude!
fonte