2011-07-21 62 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。 –

相關問題