私はMongoDBの(およびそのDOTNETコアC#のドライバ)に新たなんだ、と私はIAsyncCursorの挙動について、次の質問があります。公式ドキュメントからMongoDB C#ドライバIAsyncCursor <BsonDocument>の動作ですか?
:https://docs.mongodb.com/getting-started/csharp/query/は、それが思わIAsyncCursorを反復処理の推奨される方法次のとおりです。
var collection = _database.GetCollection<BsonDocument>("restaurants");
var filter = new BsonDocument();
var count = 0;
using (var cursor = await collection.FindAsync(filter))
{
while (await cursor.MoveNextAsync())
{
var batch = cursor.Current;
foreach (var document in batch)
{
// process document
count++;
}
}
}
しかし、それは「MoveNextAsync」最初のwhileループ、返された文書の「現在」のバッチを取得することを思わ、「MoveNextAsyncは」「現在」のバッチをスキップしていますか?論理的には、次の変更されたコードスニペットが意味がありますか?
var collection = _database.GetCollection<BsonDocument>("restaurants");
var filter = new BsonDocument();
var count = 0;
using (var cursor = await collection.FindAsync(filter))
{
do
{
if (cursor.Current != null)
{
var batch = cursor.Current;
foreach (var document in batch)
{
// process document
count++;
}
}
}
while (await cursor.MoveNextAsync())
}
私の理解では、カーソルが(もしあれば)、既に「現在」のバッチを指すことから始めなければならない、と私は最初に「現在」のバッチが何であれで作業し、次のバッチに移動しなければならないということですもしあれば、文書の
しかし、私はオンラインで見つけることができるすべてのソースについて、常に「MoveNext」を実行してからバッチを処理するように見える - これはFindAsyncによって返されたIAsyncCursorが位置1文書の実際の「現在」(または第1の)バッチよりも前に、「MoveNext」が最初に呼び出されてカーソルを実際の電流を指すように移動させる必要があります。
"MoveNext"を呼び出すと、まずwhileループがより一貫しているため、自分自身のコードスニペットで(現在の) "body"の内部の "現在"の妥当性をチェックする必要はありません。行う"。 "First()"メソッドが実際に "MoveNext"を内部的に実行して、最初に返された最初のドキュメントを返すようになりました。 「現在の」バッチの文書。
また、 "FindAsync"を使用していて、ドキュメントが自分のフィルタに基づいて見つからない場合、返されたIAsyncCursor "null"または "MoveNext"はfalseを返しますか? FindAsyncから返されるIAsyncCursorは常に有効なオブジェクトなので、nullを過度に確認する必要はなく、MoveNext()またはFirst()の戻り値を確認するだけで済みます。
MongoDBの専門家があなたの洞察を得てくれますか?
ありがとうございます!
答えをいただきありがとうございます。私は大部分ForEachAsyncを認識しており、使用しています。しかし、私の質問はMoveNextの動作に関するものですが、ForEachAsyncを使用して、サンプルコードのバニラwhileループを置き換えるかどうかは厳密には判断できません。または、私の質問がより正確に心配しているMoveNextの動作について、より具体的になるかもしれませんか? – Dejavu
@DejavuあなたはMongoDBとドライバを初めて使ったので、必要以上に難しいものになっていると思っていました。 – JohnnyHK