2011-06-27 55 views
3

我正在運行將結果數據轉儲到集合中的map reduce作業,「products」集合中的元素如下所示(該結構由Mongo生成,而我不知道如果能夠控制):MongoDB - 在C#中映射map-reduce集合

{ 
    "_id" : { "ProductId" : "1:000001", "ProductTitle" : "Some product with ID 1:000001" }, 
    "value" : { "TotalImpressions" : 3, "TotalClicks" : 40 } 
} 

理想情況下,我想每個條目下面扁平對象映射:

public class Product 
{ 
    public string ProductId { get; set; } 
    public string ProductTitle { get; set; } 
    public int TotalImpressions { get; set; } 
} 

這顯然是行不通的串行尋找屬性「 id「和」value「,它們不存在於該類中。解決方法我在的地方是對象模型,因爲它們出現,例如:

public class ProductRow 
{ 
    /* implementation of these objects excluded, but they just reflect the json objects */ 
    public ProductIdentifier Id { get; set; } 
    public Product value { get; set; } 
} 

哪款地圖正常,但是這是一個有點冗長,我寧願避免所有這些額外的對象。

是否可以配置BSON解串器來支持這種映射?我瀏覽了文檔,但沒有看到任何明顯的解決方案。

注意:我被.NET 3.5的工作環境所限制,因此請在考慮答案時考慮到這一點。

+0

你就不能映射非類型化成果到產品實例自己,後查詢?你爲什麼要BSON解串器爲你做這個?這不是嚴格的工作...... – Avish

+0

是的,我可以手動做,這是一個有效的點 - 謝謝。但我不同意這不是解串器的功能,它恰好是它的一個問題,儘管我接受的一個問題不大可能實現,因爲事實可能是一個邊緣案例,因此也是一個問題。 – gooid

回答

3

你可以很容易做反序列化自己(如@Avish建議),所以這裏是你的情況下,完整的例子:

var mongoServer = MongoServer.Create("mongodb://localhost:27020"); 
var database = mongoServer.GetDatabase("StackoverflowExamples"); 
var products = database.GetCollection("products"); 

var result = new Product(); 

var item = products.FindOne(); 
var id = item["_id"].ToBsonDocument(); 
var value = item["value"].ToBsonDocument(); 

result.ProductId = id["ProductId"].AsString; 
result.ProductTitle = id["ProductTitle"].AsString; 
result.TotalImpressions = value["TotalImpressions"].AsInt32;