Overview
En esta guía, puedes aprender cómo acceder a datos de un cursor usando el driver de .NET/C#.
Un cursor es una herramienta que devuelve los resultados de una operación de lectura en lotes iterables. Como un cursor solo contiene un subconjunto de documentos en un momento dado, los cursores reducen tanto el consumo de memoria como el uso del ancho de banda de red.
Puedes recuperar un cursor utilizando el FindSync() o método FindAsync(). También puede convertir los resultados del método Find() en un cursor encadenando el método ToCursor() o ToCursorAsync().
Datos de muestra
Los ejemplos en esta guía utilizan la colección restaurants en la base de datos sample_restaurants proporcionada en el Conjuntos de datos de muestra de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulta el Tutorial de Introducción al driver .NET/C#.
Los ejemplos de esta página utilizan el siguiente objeto Restaurant para modelar los documentos en la colección restaurants:
[] public class Restaurant { public ObjectId Id { get; set; } [] public string Name { get; set; } }
Acceso iterativo al contenido del cursor
Para iterar sobre el contenido de un cursor, utilice un bucle foreach dentro de un bloque using. El siguiente ejemplo recupera los documentos de la colección restaurants en los que el valor del campo name es "Starbucks", luego itera sobre los resultados. Selecciona el Synchronous o la pestaña Asynchronous para ver el código correspondiente:
var filter = Builders<Restaurant>.Filter.Eq(r => r.Name, "Starbucks"); using (var cursor = collection.FindSync(filter)) { while (cursor.MoveNext()) { foreach (var restaurant in cursor.Current) { Console.WriteLine(restaurant.Name); } } }
var filter = Builders<Restaurant>.Filter.Eq(r => r.Name, "Starbucks"); using (var cursor = await collection.FindAsync(filter)) { while (await cursor.MoveNextAsync()) { foreach (var restaurant in cursor.Current) { Console.WriteLine(restaurant.Name); } } }
El siguiente ejemplo realiza la misma operación pero utiliza el método ToCursor(). Selecciona la pestaña Synchronous o Asynchronous para ver el código correspondiente:
var filter = Builders<Restaurant>.Filter.Eq(r => r.Name, "Starbucks"); using (var cursor = collection.Find(filter).ToCursor()) { while (cursor.MoveNext()) { foreach (var restaurant in cursor.Current) { Console.WriteLine(restaurant.Name); } } }
var filter = Builders<Restaurant>.Filter.Eq(r => r.Name, "Starbucks"); using (var cursor = await collection.Find(filter).ToCursorAsync()) { while (await cursor.MoveNextAsync()) { foreach (var restaurant in cursor.Current) { Console.WriteLine(restaurant.Name); } } }
Recuperar todos los documentos
Advertencia
Si el número y tamaño de los documentos devueltos por la query supera la memoria disponible de la aplicación, el programa podría fallar. Si esperan un conjunto de resultados grande, accedan a su cursor de forma iterativa.
Para recuperar todos los documentos de un cursor, usa el método ToList(), tal como se muestra en el siguiente ejemplo. Seleccione la pestaña Synchronous o Asynchronous para ver el código correspondiente:
var filter = Builders<Restaurant>.Filter.Eq(r => r.Name, "Dunkin' Donuts"); var results = collection.FindSync(filter).ToList();
var filter = Builders<Restaurant>.Filter.Eq(r => r.Name, "Dunkin' Donuts"); var results = (await collection.FindAsync(filter)).ToList();
Cursores con seguimiento
Al consultar en una colección con tamaño fijo, puedes usar un cursor con seguimiento que permanece abierto después de que el cliente agota los resultados en un cursor. Para crear un cursor con seguimiento, crea un objeto FindOptions y configura la propiedad CursorType en CursorType.TailableAwait. Luego, pasa el objeto FindOptions a uno de los métodos de la operación de búsqueda. El siguiente ejemplo muestra cómo crear un cursor con seguimiento en una colección con tamaño fijo. Selecciona la pestaña Synchronous o Asynchronous para ver el código correspondiente:
var filter = Builders<Restaurant>.Filter.Eq(r => r.Name, "Dunkin' Donuts"); var options = new FindOptions<Restaurant> { CursorType = CursorType.TailableAwait }; using (var cursor = collection.FindSync(filter, options)) { while (cursor.MoveNext()) { foreach (var restaurant in cursor.Current) { Console.WriteLine(restaurant.Name); } } }
var filter = Builders<Restaurant>.Filter.Eq(r => r.Name, "Dunkin' Donuts"); var options = new FindOptions<Restaurant> { CursorType = CursorType.TailableAwait }; using (var cursor = await collection.FindAsync(filter, options)) { while (await cursor.MoveNext()) { foreach (var restaurant in cursor.Current) { Console.WriteLine(restaurant.Name); } } }
Documentación de la API
Para obtener más información sobre los métodos y clases usados en esta guía, consulte la siguiente documentación de la API: