Docs Menu
Docs Home
/ /

Acceder a los 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. Dado que un cursor solo contiene un subconjunto de documentos en un momento dado, reduce el consumo de memoria y el uso del ancho de banda de la red.

Puedes recuperar un cursor usando el FindSync() o el 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 documentos de la colección restaurants cuyo valor del campo name es "Starbucks" y, a continuación, itera sobre los resultados. Seleccione Synchronous o 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(). Seleccione 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, utilice el método ToList(), 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 una colección limitada, puede usar un cursor adaptable que permanece abierto después de que el cliente agote los resultados del cursor. Para crear un cursor adaptable, cree un FindOptions objeto y establezca la CursorType propiedad CursorType.TailableAwait en. Luego, pase el FindOptions objeto a uno de los métodos de la operación de búsqueda. El siguiente ejemplo muestra cómo crear un cursor adaptable en una colección limitada. Seleccione Synchronous Asynchronous la pestaña u 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 utilizados en esta guía, consulte la siguiente documentación de API:

Volver

Valores únicos de campo

En esta página