Visão geral
Neste guia, você pode aprender como acessar dados de um cursor usando o Driver .NET/C#.
Um cursor é uma ferramenta que retorna os resultados de uma operação de leitura em lotes iteráveis. Como um cursor contém apenas um subconjunto de documentos a qualquer momento, os cursores reduzem o consumo de memória e o uso da largura de banda da rede.
Você pode recuperar um cursor utilizando o método FindSync() ou FindAsync(). Você também pode converter os resultados do método Find() em um cursor encadeando o método ToCursor() ou ToCursorAsync().
Dados de amostra
Os exemplos neste guia utilizam a coleção do restaurants no banco de dados do sample_restaurants fornecido no conjunto de dados de amostra do Atlas. Para saber como criar um cluster gratuito do MongoDB Atlas e carregar os conjuntos de dados de exemplo, consulte o tutorial Introdução ao driver .NET/C#.
Os exemplos nesta página utilizam o seguinte objeto Restaurant para modelar os documentos na coleção restaurants:
[] public class Restaurant { public ObjectId Id { get; set; } [] public string Name { get; set; } }
Acesse o conteúdo do cursor iterativamente
Para iterar sobre o conteúdo de um cursor, use um loop foreach dentro de um bloco using. O exemplo a seguir recupera documentos da coleção restaurants nos quais o valor do campo name é "Starbucks" e, em seguida, itera sobre os resultados. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
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); } } }
O exemplo a seguir executa a mesma operação, mas usa o método ToCursor(). Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
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 os documentos
Aviso
Se o número e o tamanho dos documentos retornados pela sua query excederem a memória disponível do aplicação , seu programa poderá falhar. Se você espera um conjunto de resultados grande, acesse o cursor iterativamente.
Para recuperar todos os documentos de um cursor, use o método ToList(), como mostrado no exemplo a seguir. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
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 persistentes
When querying on a capped collection, you can use a tailable cursor that remains open after the client exhausts the results in a cursor. To create a tailable cursor, create a FindOptions object and set the CursorType property to CursorType.TailableAwait. Then, pass the FindOptions object to one of the find operation methods. The following example shows how to create a tailable cursor on a capped collection. Select the Synchronous or Asynchronous tab to see the corresponding code:
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); } } }
Documentação da API
Para saber mais sobre os métodos e classes utilizados neste guia, consulte a seguinte documentação da API: