Сопоставление BsonDocument с классом, но с ошибкой

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

{
  "_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, а для всех документов в моей коллекции.

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

1 ответ

Решение

BsonIgnoreExtraElements

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

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

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

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

Если вы не хотите игнорировать эти элементы, вы можете добавить свойство catch all, которое будет содержать все ваши дополнительные необъявленные свойства в документе bson.

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

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

В чем преимущество?

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

Другие вопросы по тегам