我从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;
}
这些功能有什么问题?或者我该怎么称呼他们?因为现在它会抛出超时。 这可以在没有异步/等待的情况下完成吗?我想我不需要它
答案 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,但是你可以修改这个方法而且只是玩它。