繁体   English   中英

C#中的MongoDB MapReduce问题

[英]MongoDB MapReduce issue in C#

我正在使用C#开发相对简单的MongoDB MapReduce演示。

代码如下:

    public List<CategorySummaryResult> GetCategorySummaries()
    {
        string map = @"
            function() {
                var key = this.FeedType;
                var value =  {count: 1, names: this.Name};
                emit(key, value);
            }";

        string reduce = @"
            function(key, values) {
                var result =  {count: 0, names: ''};

                values.forEach(function(value) {
                    result.count += value.count;
                    result.names += ',' + value.names;
                });

                return result;
            }";

        string finalize = @"
            function(key, value) {
                if (value.names.charAt(0) === ',')
                    value.names = value.names.substr(1);

                return value;                  
            }";

        var options = 
            MapReduceOptions
                .SetFinalize(finalize)
                .SetOutput(MapReduceOutput.Inline);

        var result =
            _db.GetCollection("NewsCategories")
                .MapReduce(map, reduce, options)
                .GetInlineResultsAs<CategorySummaryResult>()
                .ToList();

        return result;
    }

反序列化的对象为:

public class CategorySummaryResult
{
    public double id { get; set; }
    public ICollection<CategorySummary> value { get; set; }
}

public class CategorySummary
{
    public double count { get; set; }
    public string names { get; set; }
}

这是BSON输出的样子:

[0]: { "_id" : 1.0, "value" : { "count" : 3.0, "names" : "Games,Technologie,Auto" } }
[1]: { "_id" : 2.0, "value" : { "count" : 1.0, "names" : "Hoofdpunten" } }

但是我一直收到以下异常:

An error occurred while deserializing the value property of class MetroNews.Managers.CategorySummaryResult:
 Expected element name to be '_t', not 'count'.

怎么了, 我该如何解决

您不能正确地序列化/反序列化一个ICollection。

它将很好地序列化为任何对象的列表,但是当您想反序列化时会出现问题。

如果不通过约定指定,则反序列化器无法实例化ICollection,并且不知道要使用哪种特定类型。

你应该改变

public class CategorySummaryResult
{
   public double id { get; set; }
   public ICollection<CategorySummary> value { get; set; }
}

public class CategorySummaryResult
{
   public double id { get; set; }
   public List<CategorySummary> value { get; set; }
}

尝试将[BsonDiscriminatorAttribute(required=true)]CategorySummary类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM