Overview
En esta guía, puede aprender cómo limitar la cantidad de documentos devueltos de una operación de lectura.
Datos de muestra
Los ejemplos de esta guía utilizan lo siguiente: Course Estructura como modelo para los documentos de la colección courses:
type Course struct { Title string Enrollment int32 }
Para ejecutar los ejemplos de esta guía, cargue 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 realiza una operación de escritura, el servidor las crea implícitamente.
Cada documento contiene una descripción de un curso universitario que incluye el título del curso y la matrícula máxima, correspondiente a los campos title y enrollment de cada documento.
Limit
Para limitar la cantidad de documentos devueltos de una consulta, pase la cantidad de documentos que desea que se devuelvan 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 tienen un valor de campo 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}
Múltiples opciones
El controlador ejecuta el comportamiento límite en último lugar, independientemente del orden en el que configure 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 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 puedes incluir el Etapa$limit para especificar un límite en una canalización 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 obtener más información 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: