C#上的MongoDB入门-查询不起作用
我从c#上的MongoDb开始。最后,我需要一个简单的函数来检查用户是否存在于数据库中——就是这样。 我是一个完全的初学者,所以MongoDb教程中的示例自然不起作用 以下是一些例子:C#上的MongoDB入门-查询不起作用,c#,mongodb,mongodb-csharp-2.0,C#,Mongodb,Mongodb Csharp 2.0,我从c#上的MongoDb开始。最后,我需要一个简单的函数来检查用户是否存在于数据库中——就是这样。 我是一个完全的初学者,所以MongoDb教程中的示例自然不起作用 以下是一些例子: public static async Task<List<User>> QueryDB(User u) { var collection = _database.GetCollection<User>("UserData"); var filter = Bu
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;
}
公共静态异步任务QueryDB(用户u)
{
var collection=_database.GetCollection(“UserData”);
var filter=Builders.filter.Eq(“id”,u.id);
var result=await collection.Find(filter.toListSync();
返回结果;
}
或
公共静态异步任务QueryDB(用户u)
{
var collection=_database.GetCollection(“UserData”);
var filter=Builders.filter.Eq(“id”,u.id);
var result=await collection.Find(filter.CountAsync();
返回结果;
}
这些功能有什么问题?或者我该怎么称呼他们?因为现在它抛出了一个超时。
没有async/await可以做到这一点吗?我想我不需要它我建议使用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;
}
公共异步任务查询DB(用户u)
{
var collection=_database.GetCollection(“UserData”);
var filter=Builders.filter.Eq(us=>us.id,u.id);//防止字段名出现错误的最佳实践,如额外字母或大写与小写。
List fetchedUsers=新列表()
使用(var cursor=await collection.FindAsync(过滤器))
{
while(等待cursor.MoveNextAsync())
{
var batch=cursor.Current;
foreach(批量用户)
fetchedUsers.Add(用户);
}
}
返回获取用户;
}
如果您想“前进”,您可以使用此方法来对所有具有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
{
...
}
public async Task QueryDB(此IMongoCollection集合,T实体),其中T:Idable
{
var filter=Builders.filter.Eq(ts=>ts.id,entity.id);
List fetchedData=新列表()
使用(var cursor=await collection.FindAsync(过滤器))
{
while(等待cursor.MoveNextAsync())
{
var batch=cursor.Current;
foreach(批量存储)
fetchedData.Add(res);
}
}
返回获取的数据;
}
可识别接口
{
字符串id{get;};
}
公共类用户:Idable
{
...
}
您现在只需将此方法“附加”到所有集合。
只要创建一个列表,比如说用户类型,然后调用collection.QueryDB(用户u),你就会得到一个具有相同id的所有用户的列表,是的。可能只有1个,但是你可以修改这个方法并使用它。我建议使用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;
}
公共异步任务查询DB(用户u)
{
var collection=_database.GetCollection(“UserData”);
var filter=Builders.filter.Eq(us=>us.id,u.id);//防止字段名出现错误的最佳实践,如额外字母或大写与小写。
List fetchedUsers=新列表()
使用(var cursor=await collection.FindAsync(过滤器))
{
while(等待cursor.MoveNextAsync())
{
var batch=cursor.Current;
foreach(批量用户)
fetchedUsers.Add(用户);
}
}
返回获取用户;
}
如果您想“前进”,您可以使用此方法来对所有具有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
{
...
}
public async Task QueryDB(此IMongoCollection集合,T实体),其中T:Idable
{
var filter=Builders.filter.Eq(ts=>ts.id,entity.id);
List fetchedData=新列表()
使用(var cursor=await collection.FindAsync(过滤器))
{
while(等待cursor.MoveNextAsync())
{
var batch=cursor.Current;
foreach(批量存储)
fetchedData.Add(res);
}
}
返回获取的数据;
}
可识别接口
{
字符串id{get;};
}
公共类用户:Idable
{
...
}
您现在只需将此方法“附加”到所有集合。
只需创建一个列表,比如说用户类型,然后调用collection.QueryDB(User u),您将得到一个具有相同id的所有用户的列表,是的..可能只有1,但是你可以修改这个方法,然后玩它。听起来你可能是在玩经典。我可以不使用异步吗?不能使用2.0驱动程序,因为它是异步的。它连接到db后是否会超时,你是否通过控制台或类似mongoVUe的GUI工具测试了连接字符串?从控制台向db查询工作正常,但是你的意思是什么?听起来你可能是在玩经典游戏。我可以不使用异步吗?不使用2.0驱动程序,因为它是异步的。它连接到db后是否会引发超时,你是否通过控制台或类似mongoVUe的GUI工具测试了连接字符串?从控制台查询db工作正常,但你的意思是什么?谢谢!但当我在调用之后从另一个(也使用wait)代码调用这个函数时,调用并没有执行——程序也完成了,这与我之前的函数相同。你知道发生了什么事吗?对不起,我听不懂你说的话。你能再解释一下吗?对不起,我按了回车键)我的评论是:谢谢!但当我在调用之后从另一个(也使用wait)代码调用这个函数时,调用并没有执行——程序也完成了,这与我之前的函数相同。你知道发生了什么吗?也许你正在使用一个控制台应用程序?只需在项目结束时点击Console.Read()。另外,我建议您在调用此方法之前添加一个断点,并检查发生了什么;Console.WriteLine(用户[0]);Console.ReadLine();谢谢但是当我从ca之后的另一个(也使用wait)代码调用此函数时