2012-05-10 154 views
2
public class myType 
{ 
public int key1; 
public int key2; 
public int val1; 
public int val2; 
public int val3; 
}; 

當我向集合中插入myType對象時,讀取沒有問題。剛:MapReduce輸出C#讀取mongoDB

collection.FindAs<myType>(query); 

GET對象:

"key1":key1, "key2":key2, "val1":val1, "val2":val2, "val3":val3 

但之後的MapReduce(鍵被構造爲兩個字段的組合)輸出集合有略微改動的結構。類似於

"_id" {"key1" : key1, "key2": key2}, "value" : {"val1":val1, "val2":val2, "val3":val3} 

什麼是從輸出集合中讀取對象的方式?

回答

3

一旦你有你的輸出集合,你可以查詢它像任何其他集合。但是,由於結構不同,您將無法使用相同的C#類來完成此操作。所以,你要麼需要閱讀這是一個BsonDocument,或創建兩個新的類象下面這樣:

public class Keys 
{ 
    [BsonElement("key1")] 
    public int Key1; 
    [BsonElement("key2")] 
    public int key2; 
} 

public class values 
{ 
    [BsonElement("val1")] 
    public int Val1; 
    [BsonElement("val1")] 
    public int Val2; 
    [BsonElement("val1")] 
    public int Val3; 
} 

public class MapReduceOutput 
{ 
    [BsonId] 
    public Keys Keys; 
    [BsonElement("values")] 
    public Values Values; 
} 

然後,你可以這樣做:

collection.FindAs<MapReduceOutput>(query); 

希望這有助於。

+0

:)這是我昨天做出的完全一樣的解決方案:)但你寫的很好 – Saint

1

簡單的通過各自的假設M/R結果快(至少比自動deserializtion快)工作:

var result = RunMapReduce(..); 
foreach (var item in result.InlineResults) 
{ 
    var id = item["_id"].AsBsonDocument; 
    var value = item["value"].AsBsonDocument; 

    var obj = new myType(); 
    obj.key1 = id["key1"].AsInt32; 
    //and so on 
} 
+0

映射reduce在shell中運行,所以我沒有可能使用'result.InlineResults'。我只輸出集合。如何使用這種「混合」類型獲得所有結果? – Saint