我试图获得服务器中所有数据库的列表,并最终打印出来(即使用它们的名称作为string).对于以前版本的c#driver,我可以称之为Server.GetDatabases(),但它已被ListDatabasesAsync()取代.

返回值是IAsyncCursor<>,我不知道该怎么处理它.如何用这样一个游标遍历数据库列表(或任何东西)?

推荐答案

你有3个 Select :

  1. 使用内置驱动程序方法(例如ForEachAsyncToListAsync).
  2. 在C#8.0及更高版本上,您可以将IAsyncCursor转换为IAsyncEnumerable,并使用await foreach或任何异步LINQ运算符.
  3. 迭代IAsyncCursor次.
Built-in Driver Methods

对于IAsyncCursor,驱动程序有一些类似LINQ的扩展方法,比如AnyAsyncToListAsync等.对于迭代,它有ForEachAsync:

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

在C#8.0及更高版本上,使用await foreach进行迭代(并使用异步LINQ)要好得多.这需要将IAsyncCursor包裹在IAsyncEnumerable中.

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

C#中的传统迭代是用IEnumerableforeach完成的.foreach是编译器的语法糖.实际上是对GetEnumeratorusing范围和while循环的调用:

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

IAsyncCursor等于IEnumerator(IEnumerable.GetEnumerator的结果),IAsyncCursorSource等于IEnumerable.不同之处在于,它们支持async(并在每次迭代中获得一批,而不仅仅是一个项目).所以你可以自己实现整个usingwhile循环:

IAsyncCursorSource<int> cursorSource = null;

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

Mongodb相关问答推荐

在mongo聚合管道的组阶段排除字段,但在最后将其包含在内

如何通过 Go 以 UUID 类型保存 Mongo 中的内容?

构造函数的参数 0 需要错误类型的 bean

MongoDB - 家庭作业(job)帮助.不确定如何在 mongodb 中访问文档中的变量

Mongoose 和 MongoDB,如何在具有多个引用的两个模型之间创建关系?

使用 $addFields 将字段添加到 $lookup 结果中的每个项目

Pymongo API TypeError: Unhashable dict

如何将 MongoDB 集合中的 _id 字段更改为 User_id?

如何使用python将csv数据推送到mongodb

查找对象是否在预保存钩子mongoose中更改

MongoDB 使用自定义表达式或函数进行排序

用 Redis 查询?

使用 mongoimport 将日期(ISODate)导入 MongoDB

MongoDb 数据库与集合

Mongoose.pre('save') 不会触发

Mongoose 版本控制:when is it safe to disable it?

MongoDB MapReduce - 发出一个键/一个值不调用reduce

使用 $in 进行不区分大小写的搜索

使用命令行从 MongoDB 数据库中的所有集合中删除所有索引

Mongodb 查找除一两个条件之外的所有内容