从 C# .Net 连接 MongoDB

Posted

技术标签:

【中文标题】从 C# .Net 连接 MongoDB【英文标题】:Connect MongoDB from C# .Net 【发布时间】:2016-11-02 12:08:37 【问题描述】:

我是 MongoDB 新手,我正在尝试连接到另一个系统中的客户端服务器,但运行代码时没有任何反应。我调试了代码,发现编译器在“使用(var cursor = await collection.FindAsync(filter))”行之后没有通过。

private void btn_Click(object sender, EventArgs e)
        
            CallMain().Wait();
        

static async Task CallMain()
        
                var conString = "mongodb://215.658.326.54:2154";
                var Client = new MongoClient(conString);
                var DB = Client.GetDatabase("db_name");
                var collection = DB.GetCollection<BsonDocument>("User");
                var filter = new BsonDocument();
            try
            
                 using (var cursor = await collection.FindAsync(filter))
                
                    while (await cursor.MoveNextAsync())
                    
                        foreach (var doc in cursor.Current)
                        
                            Console.WriteLine(doc);
                        
                    
                
            
            catch (Exception ex)
            
                MessageBox.Show("Error: " + ex.Message);
            

请为此提供解决方案或指导我连接到另一台服务器中的 mongodb 和 fetech 数据的工作代码。

【问题讨论】:

尝试调试你的源代码! “什么都没发生”和“它没用”一样糟糕。单步执行您的代码。连接成功了吗?代码走什么路径? 同意@duDE。如果没有任何反应,可能您处于无限循环或类似情况。尝试逐行调试您的代码并了解它失败的地方。 它在行中失败,在此之后使用 (var cursor = await collection.FindAsync(filter)) 没有响应。 什么都没有发生是因为CallMain()是一个异步方法,你不能像这样在你的线程中捕获异常。 【参考方案1】:

这是您尝试执行的异步方法,因此请尝试使用 Task.Run 来执行该方法

private void btn_Click(object sender, EventArgs e)

    Task.Run(() => CallMain().Wait());

您可以使用此方法检索数据,而不是迭代游标

var results = await collection.Find(filter).ToListAsync();

foreach(var item in results)

    Console.WriteLine("whatever");

另外,您的过滤器变量是一个空文档,所以我假设您想要检索所有记录,如果是这样,您可以使用它

var results = await collection.Find(x => true).ToListAsync();

Find() 接受 lambda 以及从 Builders 创建的过滤器。例如,查看 Builders

var filter = Builders<YourModel>.Filter.Eq(x => x.SomeField, "SomeValue");
var results = await collection.Find(filter).ToListAsync();

和 lambda 的等价物是

var results = await collection.Find(x => x.SomeField == "SomeValue").ToListAsync();

【讨论】:

【参考方案2】:

你可以试试这段代码(mongodb c# driver 2.0.1)

static void Main(string[] args)

    Task t = MainAsync(args);
    t.Wait();


static async Task MainAsync(string[] args)

    var client = new MongoClient("mongodb://localhost:27017/test");
    var db = client.GetDatabase("name");
    var coll = db.GetCollection<Book>("collName");

【讨论】:

以上是关于从 C# .Net 连接 MongoDB的主要内容,如果未能解决你的问题,请参考以下文章

C#调用MySql

如何从 C# 读取 VB.NET 项目中的“app.config”文件

谁能给我一段ASP.NET(C#)连接SQLSERVER数据库以及输出数据的代码?

1.5万字长文:从 C# 入门 Kafka(Kafka .NET 基础)

如何使用 .NET、C# 和 WPF 检查 Internet 连接

使用 C# 和 ASP.NET 将数据从 Excel 文件导出到 SQL Server 表的最佳方法? [复制]