1

我从 C# 上的 MongoDb 开始。最后,我需要一个简单地检查用户是否存在于数据库中的函数——就是这样。我是一个完整的初学者,所以自然而然地从 MongoDb 教程中的示例不起作用这里是示例:

public  static async Task<List<User>> QueryDB(User u)
{
    var collection = _database.GetCollection<User>("UserData");
    var filter = Builders<User>.Filter.Eq("id", u.id);
    var result = await collection.Find(filter).ToListAsync();
    return result;

}

或者

public  static async Task<long> QueryDB(User u)
{
    var collection = _database.GetCollection<User>("UserData");
    var filter = Builders<User>.Filter.Eq("id", u.id);
    var result = await collection.Find(filter).CountAsync();
    return result;

}

这些功能有什么问题?或者我应该怎么称呼他们?因为现在它会引发超时。这可以在没有异步/等待的情况下完成吗?我想我不需要它

4

1 回答 1

0

我建议使用 FindAsync,它工作得更好,并且可以防止 c# 中的死锁并让 mongo 完成它的工作。

public async Task<List<User>> QueryDB(User u)
{
    var collection = _database.GetCollection<User>("UserData");
    var filter = Builders<User>.Filter.Eq(us => us.id, u.id); //best practice to prevent errors on field name such as extra letter or capital vs lowercase.
    List<User> fetchedUsers = new List<User>()
    using (var cursor = await collection.FindAsync(filter))
    {
          while (await cursor.MoveNextAsync())
          {
                 var batch = cursor.Current;
                  foreach (User user in batch)
                        fetchedUsers.Add(user);
          }
    }
    return fetchedUsers;

  }

如果你想“提前”,你可以使用这个方法来处理所有有 id 字段的类

public async Task<List<T>> QueryDB(this IMongoCollection<T> collection, T entity) where T : Idable
    {
        var filter = Builders<T>.Filter.Eq(ts => ts.id, entity.id);
        List<T> fetchedData = new List<T>()
        using (var cursor = await collection.FindAsync(filter))
        {
              while (await cursor.MoveNextAsync())
              {
                     var batch = cursor.Current;
                      foreach (T res in batch)
                            fetchedData.Add(res);
              }
        }
        return fetchedData;

      }

interface Idable
{
string id {get;};
}

public class User : Idable
{
...
}

您现在只需将此方法“附加”到您的所有集合中。只需创建一个列表,假设用户类型,然后调用 collection.QueryDB(User u),您将获得具有相同 id 的所有用户的列表,是的..可能只有 1 个,但您可以修改此方法,只需玩它。

于 2015-10-04T13:45:06.543 回答