Overview
En esta guía, puedes aprender a limitar el número de documentos devueltos por una operación de lectura.
Datos de muestra
Los ejemplos en esta guía utilizan lo siguiente Course struct como modelo para documentos en la colección courses:
type Course struct { Title string Enrollment int32 }
Para ejecutar los ejemplos en esta guía, carga los datos de muestra en la colección db.courses con el siguiente fragmento:
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)
Tip
Bases de datos y colecciones inexistentes
Si la base de datos y la colección necesarias no existen cuando realizas una operación de guardar, el servidor las crea implícitamente.
Cada documento contiene una descripción de una asignatura universitaria que incluye el título y la cantidad máxima de inscritos, correspondientes a los campos title y enrollment en cada documento.
Limit
Para limitar el número de documentos que se devuelven de una query, pase el número de documentos que desea recibir al método SetLimit() de las opciones de la operación de lectura.
Las siguientes operaciones de lectura toman un objeto de opciones como parámetro:
Find()CountDocuments()gridfs.Bucket.Find()
Si el límite es 0 o supera el número de documentos coincidentes, el método devuelve todos los documentos. Si el límite es un número negativo, el método utiliza el valor absoluto del número negativo como límite y cierra el cursor después de recuperar los documentos.
Ejemplo
El siguiente ejemplo muestra cómo devolver dos documentos que tengan un valor de campo de enrollment mayor 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}
Opciones múltiples
El controlador realiza el comportamiento de límite al final sin importar el orden en que establezcas cualquier otra opción.
Ejemplo
El siguiente ejemplo realiza una operación Find() con el siguiente comportamiento:
Ordena los resultados en orden descendente en el campo
enrollmentOmite el primer documento
Devuelve los dos primeros de los 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}
Tip
El uso de cualquiera de las siguientes configuraciones de opciones también produce el mismo 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}})
Agregación
También puede incluir el $limit etapa para especificar un límite en una pipeline de agregación.
Ejemplo
El siguiente ejemplo muestra cómo devolver tres 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}
Información Adicional
Para aprender más sobre las operaciones mencionadas, consulte las siguientes guías:
Documentación de la API
Para obtener más información sobre cualquiera de los métodos o tipos discutidos en esta guía, consultar la siguiente documentación de la API: