45 votes

Comment désérialiser un objet BsonDocument pour le ramener à la classe

Comment désérialiser un objet BsonDocument vers la classe après l'avoir obtenu du serveur ?

QueryDocument _document = new QueryDocument("key", "value");
MongoCursor<BsonDocument> _documentsReturned = _collection.FindAs<BsonDocument>(_document);

foreach (BsonDocument _document1 in _documentsReturned)
{
    //deserialize _document1
    //?
}

Dois-je désérialiser en utilisant un BsonReader ?

94voto

Andrew Orsich Points 24503

Il y a trois façons de procéder en fait :

1. spécifiez le type que vous voulez charger directement dans FindAs<>

var docs = _collection.FindAs<MyType>(_document);

2.désérialiser le document via BsonSerializer :

BsonSerializer.Deserialize<MyType>(doc);

3. mapper manuellement le document bson à votre classe :

var myClass = new Mytype();
myClass.Name = bsonDoc["name"].AsString;

Dans la plupart des cas, la première approche convient. Mais parfois, lorsque vos documents ne sont pas structurés, vous pouvez avoir besoin de la troisième approche.

0 votes

Une erreur s'est produite lors de la désérialisation de la propriété Property1 de la classe Class1 : ReadString ne peut être appelé que lorsque CurrentBsonType est String, et non lorsque CurrentBsonType est ObjectId. J'ai mis l'ObjectId bson en guid de la classe et j'ai mappé la classe. Comment puis-je résoudre ce problème ?

0 votes

@iefpw : Erreur dire que vous avez différents types de Property1 dans la base de données et dans la classe (objectId dans la base de données et string dans la classe).

0 votes

J'essayais de désérialiser vers la mauvaise classe. J'ai ajouté "ObjectId Id { get ; set ; } à la classe et, en gros, tout fonctionne sans mappage de classe.

1voto

KushalSeth Points 828

Pour les applications de grande taille et qui comportent des données structurées, il est recommandé d'utiliser votre modèle personnalisé lors de la création et de la récupération des données au lieu d'utiliser BsonDocument.

La création d'un modèle est une étape importante pour la désérialisation.

Annotations utiles à retenir lors de la création de votre modèle :

  • ajouter id dans le modèle. Essayez d'utiliser [BsonId] attribut des bonnes pratiques :
  • Créer une propriété avec une annotation comme [BsonExtraElements] il sera utilisé pour contenir tout élément supplémentaire trouvé pendant la désérialisation.
  • vous pouvez utiliser [BsonElement] pour spécifier le nom de l'élément.
  • [BsonIgnoreIfDefault] - Initialise une nouvelle instance de la classe BsonIgnoreIfDefaultAttribute.

Structure du modèle type où j'ai essayé de couvrir un maximum de cas. J'ai créé une classe de base pour la propriété _id, juste pour une meilleure architecture, mais vous pouvez l'utiliser directement dans l'application MyModel également.

    public abstract class BaseEntity
    {
        // if you'd like to delegate another property to map onto _id then you can decorate it with the BsonIdAttribute, like this
        [BsonId]
        public string id { get; set; }
    }

    public class MyModel: BaseEntity
    {
        [BsonElement("PopulationAsOn")]
        public DateTime? PopulationAsOn { get; set; }

        [BsonRepresentation(BsonType.String)]
        [BsonElement("CountryId")]
        public int CountryId { get; set; }

        [Required(AllowEmptyStrings = false)]
        [StringLength(5)]
        [BsonIgnoreIfDefault]
        public virtual string CountryCode { get; set; }

        [BsonIgnoreIfDefault]
        public IList<States> States { get; set; }

        [BsonExtraElements]
        public BsonDocument ExtraElements { get; set; }
    }

Maintenant pour désérialiser, utilisez directement votre modèle en appelant FindAsync comme ça :

cursor = await _collection.FindAsync(filter, 
new FindOptions<MyModel, MyModel>() 
{ BatchSize = 1000, Sort = sort }, ct);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X