web-dev-qa-db-fra.com

MongoDB C # Driver - Ignorer les champs lors de la liaison

Lors de l'utilisation d'un FindOne () utilisant MongoDB et C #, existe-t-il un moyen d'ignorer les champs introuvables dans l'objet?

EG, exemple de modèle.

public class UserModel
{
    public ObjectId id { get; set; }
    public string Email { get; set; }
}

Maintenant, nous stockons également un mot de passe dans la collection MongoDB, mais nous ne voulons pas le lier à l'objet ci-dessus. Quand nous faisons un Get like so,

  var query = Query<UserModel>.EQ(e => e.Email, model.Email);
  var entity = usersCollection.FindOne(query);

Nous obtenons l'erreur suivante

Element 'Password' does not match any field or property of class 

Est-il possible de dire à Mongo d'ignorer les champs qu'il ne peut pas correspondre aux modèles?

58
LiamB

Oui. Décorez simplement votre classe UserModel avec l'attribut BsonIgnoreExtraElements:

[BsonIgnoreExtraElements]
public class UserModel
{
    public ObjectId id { get; set; }
    public string Email { get; set; }
}

Comme son nom l'indique, le pilote ignore tous les champs supplémentaires au lieu de lever une exception. Plus d'informations ici - Ignorer les éléments supplémentaires .

107
i3arnon

Une autre solution possible encore consiste à enregistrer une convention à cet effet.

De cette façon, nous n'avons pas à annoter toutes les classes avec [BsonIgnoreExtraElements].

Quelque part lors de la création du client mongo, configurez les éléments suivants:

        var pack = new ConventionPack();
        pack.Add(new IgnoreExtraElementsConvention(true));
        ConventionRegistry.Register("My Solution Conventions", pack, t => true);
22
Vetras

Oui. Une autre façon (au lieu de modifier votre classe de modèle) est d'utiliser RegisterClassMap avec SetIgnoreExtraElements.

Dans votre cas, ajoutez simplement ce code lorsque vous initialisez votre pilote:

BsonClassMap.RegisterClassMap<UserModel>(cm =>
{
     cm.AutoMap();
     cm.SetIgnoreExtraElements(true);
});

Vous pouvez en savoir plus sur l'ignorance d'éléments supplémentaires en utilisant le mappage de classe ici - Ignorer les éléments supplémentaires .

17
Aviram Fireberger