【问题标题】:Connect MongoDB from C# .Net从 C# .Net 连接 MongoDB
【发布时间】: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()是一个异步方法,你不能像这样在你的线程中捕获异常。

标签: c# mongodb


【解决方案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");}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 2015-01-29
      相关资源
      最近更新 更多