Menu Docs
Página inicial do Docs
/ / /
Driver GO
/ / /

Limite o número de resultados retornados

Nesta página

  • Visão geral
  • Limite
  • Várias Opções
  • Agregação
  • Informações adicionais

Nesta aba, você pode saber como limitar o número de documentos retornados de uma operação de leitura.

Os exemplos nesta aba usam o seguinte struct Course como um modelo para documentos na coleção courses:

type Course struct {
Title string
Enrollment int32
}

Para executar os exemplos nesta aba, carregue os dados de amostra na coleção db.courses com o seguinte trecho:

coll := client.Database("db").Collection("courses")
docs := []interface{}{
Course{Title: "Romantic Era Music", Enrollment: 15},
Course{Title: "Concepts in Topology", Enrollment: 35},
Course{Title: "Ancient Greece", Enrollment: 100},
Course{Title: "Physiology I", Enrollment: 60},
}
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 contém uma descrição de um curso universitário que inclui o nome do curso e o número máximo de matrículas, correspondentes aos campos title e enrollment em cada documento.

Para limitar o número de documentos retornados de uma consulta, passe o número de documentos que você deseja retornar ao método SetLimit() das opções da operação de leitura.

As seguintes operações de leitura utilizam um objeto de opções como parâmetro:

  • Find()

  • CountDocuments()

  • gridfs.Bucket.Find()

Se o limite for 0 ou exceder o número de documentos correspondentes, o método retornará todos os documentos. Se o limite for um número negativo, o método usará o valor absoluto do número negativo como limite e fechará o cursor após a recuperação dos documentos.

O exemplo a seguir mostra como retornar dois documentos que têm um valor de campo enrollment maior que 20:

filter := bson.D{{"enrollment", bson.D{{"$gt", 20}}}}
opts := options.Find().SetLimit(2)
cursor, err := coll.Find(context.TODO(), filter, opts)
var results []Course
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
res, _ := bson.MarshalExtJSON(result, false, false)
fmt.Println(string(res))
}
{"title":"Concepts in Topology","enrollment":35}
{"title":"Ancient Greece","enrollment":100}

O driver executa o comportamento do limite por último, independentemente da ordem em que você define as outras opções.

O seguinte exemplo executa uma operação do Find() com o seguinte comportamento:

  • Classifica os resultados em ordem decrescente no campo enrollment

  • Pula o primeiro documento

  • Retorna os dois primeiros documentos restantes

filter := bson.D{}
opts := options.Find().SetSort(bson.D{{"enrollment", -1}}).SetLimit(2).SetSkip(1)
cursor, err := coll.Find(context.TODO(), filter, opts)
var results []Course
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
res, _ := bson.MarshalExtJSON(result, false, false)
fmt.Println(string(res))
}
{"title":"Physiology I","enrollment":60}
{"title":"Concepts in Topology","enrollment":35}

Dica

Usar qualquer uma das seguintes configurações de opção também produz o mesmo resultado:

opts := options.Find().SetSort(bson.D{{"enrollment", -1}}).SetSkip(1).SetLimit(2)
opts := options.Find().SetLimit(2).SetSort(bson.D{{"enrollment", -1}}).SetSkip(1)
opts := options.Find().SetLimit(2).SetSkip(1).SetSort(bson.D{{"enrollment", -1}})
opts := options.Find().SetSkip(1).SetSort(bson.D{{"enrollment", -1}}).SetLimit(2)
opts := options.Find().SetSkip(1).SetLimit(2).SetSort(bson.D{{"enrollment", -1}})

Você também pode incluir o estágio $limit para especificar um limite em uma pipeline de agregação.

O exemplo a seguir mostra como gerar três documentos:

limitStage := bson.D{{"$limit", 3}}
cursor, err := coll.Aggregate(context.TODO(), mongo.Pipeline{limitStage})
if err != nil {
panic(err)
}
var results []Course
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
res, _ := bson.MarshalExtJSON(result, false, false)
fmt.Println(string(res))
}
{"title":"Romantic Era Music","enrollment":15}
{"title":"Concepts in Topology","enrollment":35}
{"title":"Ancient Greece","enrollment":100}

Para saber mais sobre as operações mencionadas, consulte os seguintes guias:

  • Especificar uma query

  • Retrieve Data

  • Classificar resultados

  • Ignorar resultados devolvidos

  • Agregação

Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API:

Voltar

Ignorar resultados devolvidos