如何解决“预期元素名称为'_t',而不是'数字'。”

时间:2014-02-14 14:08:29

标签: c# mongodb mongodb-.net-driver aggregation-framework

我有一个像这样的mongo模型:

class ObjectA {
        [BsonId(IdGenerator = typeof(BsonObjectIdGenerator))]
        public BsonObjectId Id;

        [BsonElement("number")]
        public int Number { get; set; }

        [BsonElement("b")]
        public List<ObjectB> objectB { get; set; }
}

class ObjectB {
        [BsonElement("someProperty")]
        public string SomeProperty { get; set; }
}

我的问题是我使用{$unwind:objectB}汇总集合。结果文档在属性objectB(不是列表)上具有唯一对象。 所以演员阵容失败了,例外:

  

反序列化类的ObjectB属性时发生错误   ObjectA:预期的元素名称为'_t',而不是   '编号'

我是否必须为此创建新模型,或者有更简单的方法来解决它?

1 个答案:

答案 0 :(得分:1)

您也可以选择直接使用BsonDocument(但这不是强类型的,并且使用起来比较麻烦),例如(我在这里使用简单的Posts / Tags示例)

var aggregationResults = db.GetCollection("Posts").Aggregate().ResultDocuments;
foreach (var document in aggregationResults)
{
    var tag = document.GetValue("Tags").AsString;
}

与普通的查询和投影运算符不同,聚合框架可能会更改文档的结构。正如您已经指出的那样,$unwind将包含数组的文档转换为多个文档,每个文档都具有相同名称的单个值。

另一种方法是确实为此创建一个新类型,所以

class Post {
    public List<string> Tags { get; set; }
    ...

会变成

class PostAggregationResult {
    public string Tags { get; set; }
    ...

这很容易使用,但如果你有各种各样的聚合查询,你需要大量的类,这可能很烦人。