MongoDB - 在C#中映射map-reduce集合

3

我正在运行一个map reduce作业,将结果数据转储到集合中,"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",而该类上不存在这些属性。我采用的解决方法是按照它们出现的方式对对象进行建模,例如:

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反序列化器以支持该映射?我已经查看了文档,但没有看到明显的解决方案。

注:由于工作环境的限制,我只能使用.NET 3.5,请在考虑答案时记住这一点。


你难道不能在查询之后自己将无类型的结果映射为 Product 实例吗?为什么要让 BSON 反序列化器为你做这个工作呢?严格来说,这不是它的职责。 - Avish
是的,我可以手动完成它,这是一个有效的观点 - 所以谢谢。但我不同意这不是反序列化器的功能,它确实是它的领域中的问题,尽管我承认这个问题由于它可能是边缘情况而不太可能被实现,因此提出了这个问题。 - gooid
1个回答

4

您可以像@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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接