Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Acceder a datos desde un cursor

En esta guía, puede aprender cómo acceder a los datos de un cursor utilizando el controlador .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().

Los ejemplos de 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, consulte Comience con el tutorial del controlador .NET/C#.

Los ejemplos de esta página utilizan el siguiente objeto Restaurant para modelar los documentos de la colección restaurants:

[BsonIgnoreExtraElements]
public class Restaurant
{
public ObjectId Id { get; set; }
[BsonElement("name")]
public string Name { get; set; }
}

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);
}
}
}

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();

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);
}
}
}

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:

Volver

Valores únicos de campo

En esta página