2016-01-16 3 views
2

Это мой BsonDocument, который я извлекаю из своей коллекции MongoDb. Я хотел бы десериализовать (или сопоставить) это с объектом/классом, который я сделал на C#.Сопоставление BsonDocument с классом, но получение ошибки

{ 
    "_id" : ObjectId("5699715218a323101c663b9a"), 
    "type": null, 
    "text": "Hello this is text", 
    "user": 
    { 
     "hair": "brown", 
     "age": 64 
    }  
} 

Это класс, к которому я хотел бы привязать/десериализовать BsonDocument. Поля внутри моего класса являются единственными, которые я хотел бы получить.

public class MyType 
    { 
     public BsonObjectId _id { get; set; } 
     public BsonString text { get; set; } 
    } 

В настоящее время это, как я пытаюсь сделать это, но я получаю сообщение об ошибке, что «элемент„типа“не соответствует ни одному полю или свойству класса MyType». Я не хочу включать поле типа в класс MyType.

var collection = db.GetCollection<BsonDocument>("data_of_interest"); 
var filter = new BsonDocument(); 
var myData = collection.Find(filter).FirstOrDefault(); 
MyType myObject = BsonSerializer.Deserialize<MyType>(myData); 

Я получаю сообщение об ошибке на последней строке. В этом примере я пытаюсь сделать это только для одного документа для одного экземпляра объекта MyType. Меня также интересует, как десериализовать целую коллекцию в список объекта MyType или что-то подобное, если оно не только для одного BsonDocument, но и для всех документов в моей коллекции.

Спасибо за ваше время.

ответ

3

BsonIgnoreExtraElements

Флаг ваш класс с атрибутом [BsonIgnoreExtraElements]. Это скажет, что драйвер C# не будет волноваться, если между вашими свойствами класса и записью mongo нет соответствия 1: 1.

[BsonIgnoreExtraElements] 
public class MyType 
{ 
    public BsonObjectId _id { get; set; } 
    public BsonString text { get; set; } 
} 

При таком подходе свойства типа и пользователя будут игнорироваться.

Добавить «поймать всех» собственность для дополнительных элементов

Если вы не хотите игнорировать эти элементы, то вы можете добавить уловом все имущество, которое разместится все дополнительные «необъявленной» свойства в bson document.

public class MyType 
{ 
    public BsonObjectId _id { get; set; } 
    public BsonString text { get; set; } 
    [BsonExtraElements] 
    public BsonDocument CatchAll { get; set; } 
} 

При таком подходе тип и пользователь будут существовать как свойства свойства .CatchAll.

Какое преимущество?

Одним из больших преимуществ является то, что вы можете сделать «findAndReplace» с последним, не теряя данные из полей, которые вы не сопоставляете.

+0

Большое спасибо! Это было именно то, что я искал, и удивляюсь, что после всех моих поисков я никогда не видел этого атрибута. CatchAll отлично работает, и все работает. –