sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur används en IAsyncCursor för iteration med mongodb c#-drivrutinen?

Du har 3 alternativ:

  1. Använd den inbyggda drivrutinsmetoden (t.ex. ForEachAsync , ToListAsync ).
  2. På C# 8.0 och senare kan du konvertera IAsyncCursor till en IAsyncEnumerable och använd await foreach eller någon asynkron LINQ-operatör.
  3. Iterera över IAsyncCursor .
Inbyggda drivrutinsmetoder

Drivrutinen har några LINQ-liknande tilläggsmetoder för IAsyncCursor , som AnyAsync , ToListAsync , etc. För iteration har den ForEachAsync :

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

På C# 8.0 och senare är det mycket trevligare att iterera med await foreach (och använd async LINQ). Detta kräver att du lindar IAsyncCursor i en IAsyncEnumerable .Du kan göra det själv men eftersom det är viktigt att få några viktiga saker rätt (som avbokning och kassering) har jag publicerat ett nuget-paket:MongoAsyncEnumerableAdapter

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

Traditionell iteration i C# görs med IEnumerable och foreach . foreach är kompilatorns syntaktiska socker. Det är faktiskt ett anrop till GetEnumerator , en using scope och en while loop:

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

IAsyncCursor motsvarar IEnumerator (resultatet av IEnumerable.GetEnumerator ) medan IAsyncCursorSource är att IEnumerable . Skillnaden är att dessa stöder async (och få en batch varje iteration och inte bara ett enda föremål). Så du kan implementera hela using , while loop sak själv:

IAsyncCursorSource<int> cursorSource = null;

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


  1. Spring MongoDB Repository fungerar endast i vissa fall

  2. Ta bort dokument från en MongoDB-samling baserat på tidpunkten för ett datumfält

  3. Vad är tcp-backlog i redis.conf

  4. Exportera och återanvänd min mongoose-anslutning över flera modeller