如何在新的mongo C#驱动程序中执行findAll并使其同步

时间:2015-04-17 21:41:25

标签: c# .net mongodb mongodb-.net-driver mongodb-csharp-2.0

我使用官方C#驱动程序执行FindAll并升级到新驱动程序2.0。 FindAll已过时,将替换为Find。我正在尝试转换一个返回Class1列表的简单方法。无法在文档中使用POCO找到一个真实的例子

var collection = database.GetCollection<ClassA>(Collection.MsgContentColName); return collection.FindAll().ToList();

有人可以帮我转换2.0驱动程序并返回列表而不是任务吗?

6 个答案:

答案 0 :(得分:43)

编辑:

他们决定添加回同步支持(尽管异步仍然是IO操作的首选)所以你可以简单地使用:

var list = collection.Find(_ => true).ToList();

原件:

不要在异步代码上同步阻塞。它对性能有害并可能导致死锁。

如果您希望保持应用程序同步,建议您继续使用旧的同步驱动程序。

在新的v2.0驱动程序中,async选项应如下所示:

async Task FooAsync()
{
    var list = await collection.Find(_ => true).ToListAsync();
}

答案 1 :(得分:2)

使用MongoDb 2.2.4版,实现稍有改变。 按照最佳实践,让我们构建MongoDb连接:

public static class PatientDb
{
    public static IMongoCollection<Patient> Open()
    {
        var client = new MongoClient("mongodb://localhost");
        var db = client.GetDatabase("PatientDb");
        return db.GetCollection<Patient>("Patients");
    } 
}

现在返回IMongoCollection的接口而不是像MongoCollection这样的具体类的实例。无需再创建服务器实例来获取数据库,客户端可以直接访问数据库。

然后在控制器中这样完成:

public class PatientController : ApiController
{
    private readonly IMongoCollection<Patient> _patients;

    public PatientController()
    {
        _patients = PatientDb.Open();
    }
    public IEnumerable<Patient> Get()
    {
        return _patients.Find(new BsonDocument()).ToEnumerable();
    }
}

其中_patients是IMongoCollection并且要检索所有患者而不是使用FindAll()现在使用Find(),其中过滤器是BsonDocument的新实例。< / p>

答案 2 :(得分:1)

这是使用MongoDb C#Driver 2.2

新的C#驱动程序是异步的。无论喜欢与否,都应该处理它。它将来会派上用场。但是现在......

在下面的代码中,由于代码&#34; result.GetAwaiter()。GetResult();&#34;,异步调用实际上是同步的。这使得异步代码在正常流程中执行到最终状态。

    static void MongoGoNow()
    {
        IMongoCollection<ClassA> collection = db.GetCollection<ClassA>(Collection.MsgContentColName);
        var result = TestFind(collection);
        result.GetAwaiter().GetResult();
        //What's next???
    }

    static async Task TestFind(IMongoCollection<ClassA> MyCollection)
    {
        var filter = new BsonDocument();
        var count = 0;
        using (var cursor = await MyCollection.FindAsync(filter))
        {
            while (await cursor.MoveNextAsync())
            {
                var batch = cursor.Current;
                foreach (var document in batch)
                {
                    // process document
                    count++;
                }
            }
        }       

您还可以在Main方法中合并最后两行代码,如下所示:

    static void MongoGoNow()
    {
        IMongoCollection<ClassA> collection = db.GetCollection<ClassA>(Collection.MsgContentColName);
        TestFind(collection).GetAwaiter().GetResult();
        //What's next???
    }

答案 3 :(得分:0)

要检索全部内容,可以按照documentation

使用空过滤器

FilterDefinition<T>.Empty

例如

    public async Task<IEnumerable<ClassA>> GetAllAsync() =>
                await database.GetCollection<ClassA>(Collection.MsgContentColName)
               .Find(FilterDefinition<ClassA>.Empty).ToListAsync();

答案 4 :(得分:0)

这等同于FindAll(),

var list = await collection.Find(new BsonDocument()).ToListAsync();

答案 5 :(得分:-12)

你可以这样做来实现相同的使用2.0驱动程序,

var collection = database.GetCollection<ClassA>(Collection.MsgContentColName);
var doc = collection.Find(filter).ToListAsync();
doc.Wait();
return doc.Result;