在C#上开始使用MongoDB - 查询不起作用

时间:2015-10-04 12:31:17

标签: c# mongodb mongodb-csharp-2.0

我从c#上的MongoDb开始。最后,我需要的功能只是检查用户是否存在于DB -thats中。 我是一个完整的初学者,所以很自然地从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;

}

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

1 个答案:

答案 0 :(得分: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;

  }

如果你想&#34;提前&#34;您可以将此方法用于具有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
{
...
}

你只需要这种方法&#34;附加&#34;现在所有的收藏品。 只需创建一个列表,让我们说用户的类型,并调用collection.QueryDB(用户u),你将得到一个具有相同id的所有用户的列表,是的...可能只有1,但是你可以修改这个方法而且只是玩它。