MongoDB - Отображение карт-уменьшают коллекции в C # - PullRequest
3 голосов
/ 27 июня 2011

Я выполняю задание уменьшения карты, которое выводит полученные данные в коллекцию, элементы в коллекции "products" выглядят так (структура генерируется Mongo, и я не знаю, можно ли ее контролировать):

{
    "_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" на корневом уровне, которых нет в этом классе. Обходной путь, который у меня есть, - это моделирование объекта по мере его появления, например ::100100

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 для поддержки этого сопоставления? Я просмотрел документацию, но не нашел очевидного решения.

NB. В рабочей среде я ограничен .NET 3.5, поэтому помните об этом при рассмотрении ответа.

1 Ответ

3 голосов
/ 27 июня 2011

Вы можете легко выполнить десериализацию самостоятельно (как предложено @ 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;
...