2011-04-10 135 views
2

我是新來的MongoDB,並想知道與註冊的BsonClassMaps查詢域對象。 考慮下面的映射:C#MongoDB查詢與BsonClassMaps

BsonClassMap.RegisterClassMap<VoyageNumber>(cm => 
      { cm.MapField<string>(p => p.Id); }); 

BsonClassMap.RegisterClassMap<Schedule>(cm => 
     { cm.MapField<DateTime>(p => p.EndDate); cm.MapField<DateTime>(p => p.StartDate); }); 

BsonClassMap.RegisterClassMap<Voyage>(cm => 
      { cm.MapIdField<VoyageNumber>(p => p.VoyageNumber); cm.MapField<Schedule>(p => p.Schedule); }); 

域實體是 「航程」。在這個簡單的例子中,它由一個複雜的類型「Schedule」(帶有開始日期和結束日期)和一個VoyageNumber(帶有一個字符串id字段)組成。 「VoyageNumber」是實體的標識符。

現在我可以插入一個新的航程只是罰款:

MongoCollection<Voyage> mongoVoyages = context.MyDB.GetCollection<Voyage>("Voyages"); 

mongoVoyages.Insert<Voyage>(voyage); 

我可以檢索通過一個航程:

MongoCollection mongoVoyages = context.MyDB.GetCollection("Voyages"); 

BsonDocument result = mongoVoyages.FindOneAs<BsonDocument>(); 
BsonDocument sched = result["Schedule"].AsBsonDocument; 
DateTime start = sched["StartDate"].AsDateTime; 
//etc... 

當然現在我想通過ID進行搜索的航行。我如何通過上面顯示的映射來實現這一點?我嘗試了這樣的事情,但失敗了:

Query.EQ("VoyageNumber", someStringID) 

我使用官方的C#驅動程序1.0。

回答

1

通過上面的類註冊,你將有文檔這樣MongoDB中:

{ 
    "_id": { 
    "_id": someStringID 
    }, 
    "Schedule": { 
    "EndDate": "Sun, 10 Apr 2011 13:06:25 GMT +03:00", 
    "StartDate": "Sun, 10 Apr 2011 13:06:25 GMT +03:00" 
    } 
} 

所以,如果你想通過VoyageNumber標識得到Voyage你應該使用下面的查詢:

Query.EQ("_id._id", someStringID) 

注:你不需要BsonClassMap.RegisterClassMap爲類,如果你映射所有文件,因爲它將被默認序列化,沒有任何註冊。您也可以使用[BsonId][BsonIgnore]等屬性進行自定義序列化。有關更多詳細信息,請檢查documentation或詢問另一個問題;)。

從技術文檔:

你可以自己創建這個類地圖 或簡單地允許類映射 被自動創建時,首先需要 (稱爲「自動映射」)。通過 您可以 發揮在 自動映射過程或者一些控制與 序列化相關的屬性或 使用初始化代碼(裝飾你的類屬性 使用起來非常方便,但對於 那些誰喜歡保持系列化 細節出了自己域類可以 放心,任何可以用屬性來完成 也可以做 沒有他們)

+0

謝謝你,工作以及促進了我的面向文檔DB的理解。所以你說我不需要映射除IdField之外的其他字段? – hoetz 2011-04-10 14:59:36

+0

@Malkier:不,你根本不需要映射。至少在你的例子中。我從文檔中添加了一些筆記來解決我的問題。 – 2011-04-10 16:34:21