sql >> Database >  >> NoSQL >> MongoDB

Hoe wordt een IAsyncCursor gebruikt voor iteratie met het mongodb c#-stuurprogramma?

Je hebt 3 opties:

  1. Gebruik de ingebouwde drivermethode (bijv. ForEachAsync , ToListAsync ).
  2. Op C# 8.0 en hoger kun je de IAsyncCursor . converteren in een IAsyncEnumerable en gebruik await foreach of een asynchrone LINQ-operator.
  3. Herhaal over de IAsyncCursor .
Ingebouwde stuurprogrammamethoden

Het stuurprogramma heeft enkele LINQ-achtige extensiemethoden voor IAsyncCursor , zoals AnyAsync , ToListAsync , etc. Voor iteratie heeft het ForEachAsync :

var cursor = await client.ListDatabasesAsync();
await cursor.ForEachAsync(db => Console.WriteLine(db["name"]));
Converteren naar IAsyncEnumerable

Op C# 8.0 en hoger moet het leuker zijn om te herhalen met await foreach (en gebruik asynchrone LINQ). Dit vereist het verpakken van de IAsyncCursor in een IAsyncEnumerable .Je kunt het zelf doen, maar omdat het belangrijk is om een ​​aantal cruciale dingen goed te krijgen (zoals annulering en verwijdering), heb ik een nuget-pakket gepubliceerd:MongoAsyncEnumerableAdapter

var cursor = await client.ListDatabasesAsync();
await foreach (var db in cursor.ToAsyncEnumerable())
{
    Console.WriteLine(db["name"]);
}
Aangepaste iteratie

Traditionele iteratie in C# wordt gedaan met IEnumerable en foreach . foreach is de syntactische suiker van de compiler. Het is eigenlijk een oproep naar GetEnumerator , een using bereik en een while lus:

using (var enumerator = enumerable.GetEnumerator())
{
    while (enumerator.MoveNext())
    {
        var current = enumerator.Current;
        // use current.
    }
}

IAsyncCursor is gelijk aan IEnumerator (het resultaat van IEnumerable.GetEnumerator ) terwijl IAsyncCursorSource is naar IEnumerable . Het verschil is dat deze async . ondersteunen (en ontvang elke iteratie een batch en niet slechts een enkel item). U kunt dus de hele using , while loop ding zelf:

IAsyncCursorSource<int> cursorSource = null;

using (var asyncCursor = await cursorSource.ToCursorAsync())
{
    while (await asyncCursor.MoveNextAsync())
    {
        foreach (var current in asyncCursor.Current)
        {
            // use current
        }
    }
}


  1. $elemMatch-equivalent in lentegegevens mongodb

  2. Mongodb:$in-operator versus veel enkele zoekopdrachten

  3. Hoe kan ik MongoDB in Kohana gebruiken?

  4. MongoDb-filterarray