我在我的测试项目中使用c#官方mongodb驱动程序,我已经将文件从c#web应用程序插入mongodb。在mongo控制台中,db.blog.find()可以显示我插入的条目。但是当我试图检索它们时,.net会抛出异常
“System.InvalidOperationException:只有在CurrentBsonType为String时才能调用ReadString,而不能在CurrentBsonType为ObjectId时调用。”
我的实体类很简单
namespace MongoDBTest
{
public class Blog
{
public String _id
{
get;
set;
}
public String Title
{
get;
set;
}
}
}
这是我的检索代码
public List<Blog> List()
{
MongoCollection collection = md.GetCollection<Blog>("blog");
MongoCursor<Blog> cursor = collection.FindAllAs<Blog>();
cursor.SetLimit(5);
return cursor.ToList();
}
有人可以帮帮我吗?谢谢!
答案 0 :(得分:10)
我想您只需要使用BsonId
标记您的博客ID(并自行插入ID)属性:
public class Blog
{
[BsonId]
public String Id {get;set;}
public String Title{get;set;}
}
一切都应该没问题。问题是因为您没有标记Mongodb _id和驱动程序生成的带有ObjectId类型的_id字段的字段。当驱动程序尝试反序列化它时,他无法将ObjectId转换为String。
完整示例:
MongoCollection collection = md.GetCollection<Blog>("blog");
var blog = new Blog(){Id = ObjectId.GenerateNewId().ToString(),
Title = "First Blog"};
collection .Insert(blog);
MongoCursor<Blog> cursor = collection.FindAllAs<Blog>();
cursor.SetLimit(5);
var list = cursor.ToList();
答案 1 :(得分:2)
使用C#从MongoDB中检索数据非常简单,有三种不同的方式可以为前端推出数据
LINQ
using (var cursor = await col.Find(new BsonDocument()).ToCursorAsync())
{
while (await cursor.MoveNextAsync())
{
foreach (var doc in cursor.Current)
{
Console.WriteLine(doc);
}
}
}
上面的代码显示使用游标检索数据。 Referrence
答案 2 :(得分:1)
在github上查看我的sample project。最近,我对MongoDB真的很感兴趣。此应用程序显示了许多您可能感兴趣的有用的东西; MongoDB的存储库模式。
答案 3 :(得分:0)
id成员的类型和名称应该如下所示
public ObjectId Id { get; set; }
ObjectId
位于名称空间MongoDB.Bson