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?
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 .
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);
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 .