2014-02-14 1 views
0

У меня есть модель Монго, как это:Как решить «Ожидаемое имя элемента -« _t », а не« число ».»

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}. В результате documencts имеют уникальный объект на свойстве objectB (а не в списке). Так литые failes за исключением:

Произошла ошибка при десериализации свойство ObjectB из класса Objecta: Ожидаемое имя элемента, чтобы быть «_t», не «номер».

Должен ли я создать новую модель для этого или есть более простой способ ее решения?

ответ

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; } 
    ... 

Это очень легко работать, но если у вас есть очень различные запросы агрегации , вам нужно большое количество классов, которые могут раздражать.