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

コレクションにmyTypeオブジェクトを挿入すると、読み込みに問題はありません。ジャスト:MapReduce出力mongoDB

collection.FindAs<myType>(query); 

オブジェクトを取得:

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

しかし、MapReduceの後に(キーは、二つのフィールドの組み合わせとして構成されている)の出力コレクションは、わずかに変更された構造を有しています。何かのように

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

出力コレクションからオブジェクトを読み取る方法は何ですか?

速く動作するようになっM/Rの結果を介して各用のシンプルな

答えて

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

(少なくとも速く自動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

map reduceはシェルで実行されているので、 'result.InlineResults'を使用することはできません。私はアウトプットコレクションしか持っていません。どのようにこの '混合'タイプのすべての結果を取得するには? – Saint

関連する問題