Visão geral
Neste guia, você pode aprender a obter uma contagem precisa e estimada do número de documentos em sua coleção.
Dados de amostra
Os exemplos nesta seção usam a seguinte estrutura Tea
como um modelo para documentos na coleção tea
:
type Tea struct { Type string Rating int32 }
Para executar os exemplos neste guia, carregue os dados de amostra na collection do tea
no banco de dados do db
com o seguinte trecho:
coll := client.Database("db").Collection("tea") docs := []interface{}{ Tea{Type: "Masala", Rating: 10}, Tea{Type: "Matcha", Rating: 7}, Tea{Type: "Assam", Rating: 4}, Tea{Type: "Oolong", Rating: 9}, Tea{Type: "Chrysanthemum", Rating: 5}, Tea{Type: "Earl Grey", Rating: 8}, Tea{Type: "Jasmine", Rating: 3}, Tea{Type: "English Breakfast", Rating: 6}, Tea{Type: "White Peony", Rating: 4}, } result, err := coll.InsertMany(context.TODO(), docs)
Dica
Bancos de Dados e Coleções Inexistentes
Se o banco de dados e a collection necessários não existirem quando você executar uma operação de escrita, o servidor implicitamente os criará.
Cada documento descreve um tipo de chá e sua classificação. Estes itens correspondem aos campos type
e rating
.
Contagem precisa
Para contar o número de documentos que correspondem ao seu filtro de queries, utilize o método CountDocuments()
. Se você passar por um filtro de queries vazio, esse método retornará o número total de documentos na coleção.
Dica
Quando você usa CountDocuments()
para retornar o número total de documentos em uma coleção, o MongoDB executa uma verificação da coleção. Você pode evitar uma verificação da coleção e melhorar o desempenho desse método usando uma dica para aproveitar o índice incorporado no campo _id
. Utilize esta técnica somente ao chamar CountDocuments()
com um parâmetro de query vazio.
opts := options.Count().SetHint("_id_") count, err := coll.CountDocuments(context.TODO(), bson.D{}, opts) if err != nil { panic(err) }
Modificar comportamento
Você pode modificar o comportamento de CountDocuments()
passando a um tipo CountOptions
. Se você não especificar nenhuma opção, o driver usará seus valores padrão.
O tipo CountOptions
permite a você configurar opções com os seguintes métodos:
Método | Descrição |
---|---|
| The type of language collation to use when sorting results. Default: nil |
| The index to use to scan for documents to count. Default: nil |
| The maximum number of documents to count. Default: 0 |
| The number of documents to skip before counting. Default: 0 |
Exemplo
O exemplo a seguir conta o número de documentos em que o rating
é menor que 6
:
filter := bson.D{{"rating", bson.D{{"$lt", 6}}}} count, err := coll.CountDocuments(context.TODO(), filter) if err != nil { panic(err) } fmt.Printf("Number of documents with a rating less than six: %d\n", count)
Number of documents with a rating less than six: 4
Agregação
Você também pode incluir o estágio $count para contar o número de documentos em um pipeline de agregação.
Exemplo
O exemplo a seguir executa as seguintes ações:
Conta o número de documentos em que o valor do campo
rating
é maior que5
Atribui a contagem ao campo
counted_documents
matchStage := bson.D{{"$match", bson.D{{"rating", bson.D{{"$gt", 5}}}}}} countStage := bson.D{{"$count", "counted_documents"}} cursor, err := coll.Aggregate(context.TODO(), mongo.Pipeline{matchStage, countStage}) if err != nil { panic(err) } var results []bson.D if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { fmt.Println(result) }
[{counted_documents 5}]
Contagem estimada
Para estimar o número de documentos em sua coleção, use o método EstimatedDocumentCount()
.
Observação
O método EstimatedDocumentCount()
é mais rápido do que o método CountDocuments()
, pois usa os metadados da coleção em vez de fazer a varredura de toda a coleção.
Modificar comportamento
Você pode modificar o comportamento de EstimatedDocumentCount()
passando um tipo EstimatedDocumentCountOptions
. Se você não especificar nenhuma opção, o driver usará os valores padrão.
O tipo EstimatedDocumentCountOptions
permite que você configure opções usando os seguintes métodos:
Método | Descrição |
---|---|
| Sets a comment to attach to the count operation. Default: nil |
Exemplo
O exemplo a seguir estima o número de documentos na coleção tea
:
count, err := coll.EstimatedDocumentCount(context.TODO()) if err != nil { panic(err) } fmt.Printf("Estimated number of documents in the tea collection: %d\n", count)
Estimated number of documents in the tea collection: 9
Exemplo de contagem de documentos: arquivo completo
Observação
Exemplo de configuração
Esse exemplo se conecta a uma instância do MongoDB usando um URI de conexão. Para saber mais sobre como se conectar à sua instância do MongoDB, consulte o guia Criar um MongoClient. Este exemplo também utiliza a coleção do restaurants
no banco de dados do sample_restaurants
incluído nos conjuntos de dados de amostra do Atlas. Você pode carregá-los em seu banco de dados na camada grátis do MongoDB Atlas seguindo o Guia de Introdução ao Atlas.
Este exemplo executa o seguinte na coleção restaurants
:
Estima o número de documentos na coleção
Conta o número de documentos em que o valor do campo
cuisine
é"American"
// Counts documents in a collection by using the Go driver package main import ( "context" "fmt" "log" "os" "github.com/joho/godotenv" "go.mongodb.org/mongo-driver/v2/bson" "go.mongodb.org/mongo-driver/v2/mongo" "go.mongodb.org/mongo-driver/v2/mongo/options" ) type Restaurant struct { ID bson.ObjectID `bson:"_id"` Name string RestaurantId string `bson:"restaurant_id"` Cuisine string Address interface{} Borough string Grades interface{} } func main() { if err := godotenv.Load(); err != nil { log.Println("No .env file found") } var uri string if uri = os.Getenv("MONGODB_URI"); uri == "" { log.Fatal("You must set your 'MONGODB_URI' environment variable. See\n\t https://www.mongodb.com/pt-br/docs/drivers/go/current/usage-examples/#environment-variable") } client, err := mongo.Connect(options.Client().ApplyURI(uri)) if err != nil { panic(err) } defer func() { if err = client.Disconnect(context.TODO()); err != nil { panic(err) } }() coll := client.Database("sample_restaurants").Collection("restaurants") // Specifies a filter to match documents where the "cuisine" field // has a value of "American" filter := bson.D{{"cuisine", "American"}} // Retrieves and prints the estimated number of documents in the collection estCount, estCountErr := coll.EstimatedDocumentCount(context.TODO()) if estCountErr != nil { panic(estCountErr) } // Retrieves and prints the number of matching documents in the collection count, err := coll.CountDocuments(context.TODO(), filter) if err != nil { panic(err) } // When you run this file, it should print: // Estimated number of documents in the movies collection: 25359 // Number of restaurants with American cuisine: 6183 fmt.Printf("Estimated number of documents in the restaurants collection: %d\n", estCount) fmt.Printf("Number of restaurants with American cuisine: %d\n", count) }
Estimated number of documents in the restaurants collection: 25359 Number of restaurants with American cuisine: 6183
Informações adicionais
Para saber mais sobre as operações mencionadas, consulte os seguintes guias:
Documentação da API
Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API: