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

Когда я вставляю myType объектов в коллекцию, нет проблем с чтением. Просто:MapReduce output C# reading 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} 

Каков способ чтения объекта из выходной коллекции?

ответ

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