2011-07-21 55 views
9

我在我的测试项目中使用官方的mongodb驱动程序进行c#,并且已经将文档从c#web应用程序插入到mongodb中。在mongo控制台中,db.blog.find()可以显示我插入的条目。但是当我试图检索它们时,.net抛出异常使用C#驱动程序从mongodb中检索数据

“System.InvalidOperationException:ReadString只能在CurrentBsonType为String时调用,而不能在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(); 
} 

任何人可以帮助我吗?谢谢!

回答

10

我想你只需要BsonId博客标记ID(并插入ID自己)属性:

public class Blog 
{ 
    [BsonId] 
    public String Id {get;set;} 

    public String Title{get;set;} 
} 

而且所有应该没问题。问题是因为你没有标记什么字段是Mongodb _id和驱动程序生成的类型为ObjectId的_id字段。当驱动程序尝试将其反序列化时,他无法将ObjectId转换为字符串。

完整的示例:

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(); 
+0

嗨Andrew Orsich,谢谢你的回复。 –

+0

嗨Andrew Orsich,我已经使用** BsonDocument **和mongodb自动生成ObjectId文件并存储它,当我使用MongoCollection 插入文档并调用FindAllAs 方法时,ReadString方法抛出异常。 **因此,我将MongoCollection 更改为MongoCollection ,并在foreach语句中遍历游标对象以将每个文档转换为博客对象**。无论如何,你的回复帮助我解决了我的问题,谢谢你:) –

+0

更简单的解决方法是将ID的数据类型更改为ObjectId并用[BsonId]装饰它。我遇到了同样的错误信息,并且为我修复了这个问题。 – CodeMonkey1313

1

看看我sample project在github上。晚了,我对MongoDB非常感兴趣。这个应用程序显示了许多有用的东西,也可能会让你感兴趣存储库模式与MongoDB。

0

ID构件的类型和名称应该是不同的如下

public ObjectId Id { get; set; } 

ObjectId是在命名空间MongoDB.Bson

2

使用C#检索从MongoDB的数据是非常简单,有三个数据可用于前端的不同方式

  1. 列表
  2. 光标
  3. LINQ

    using (var cursor = await col.Find(new BsonDocument()).ToCursorAsync()) 
    { 
    while (await cursor.MoveNextAsync()) 
    { 
        foreach (var doc in cursor.Current) 
        { 
         Console.WriteLine(doc); 
        } 
        } 
    } 
    

上面的代码显示检索使用游标的数据。 Referrence

+0

这使用新的API。太好了,thx。 –

相关问题