2012-05-10 7 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); 

GET 개체 :

"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

지도 축소가 셸에서 실행 중이므로 'result.InlineResults'를 사용할 수 없습니다. 출력 컬렉션 만 있습니다. 이 '혼합'유형으로 모든 결과를 얻는 방법은 무엇입니까? – Saint

관련 문제