MongoDB C# Driver - Ignore fields on binding
Solution 1
Yes. Just decorate your UserModel
class with the BsonIgnoreExtraElements
attribute:
[BsonIgnoreExtraElements]
public class UserModel
{
public ObjectId id { get; set; }
public string Email { get; set; }
}
As the name suggests, the driver would ignore any extra fields instead of throwing an exception. More information here - Ignoring Extra Elements.
Solution 2
Yet Another possible solution, is to register a convention for this.
This way, we do not have to annotate all classes with [BsonIgnoreExtraElements].
Somewhere when creating the mongo client, setup the following:
var pack = new ConventionPack();
pack.Add(new IgnoreExtraElementsConvention(true));
ConventionRegistry.Register("My Solution Conventions", pack, t => true);
Solution 3
Yes. Another way (instead of editing you model class) is to use RegisterClassMap
with SetIgnoreExtraElements
.
In your case just add this code when you initialize your driver:
BsonClassMap.RegisterClassMap<UserModel>(cm =>
{
cm.AutoMap();
cm.SetIgnoreExtraElements(true);
});
You can read more about ignoring extra elements using class mapping here - Ignoring Extra Elements.
LiamB
Tech Director at Silverchip (www.silverchip.com). SOreadytohelp
Updated on July 05, 2022Comments
-
LiamB almost 2 years
When using a FindOne() using MongoDB and C#, is there a way to ignore fields not found in the object?
EG, example model.
public class UserModel { public ObjectId id { get; set; } public string Email { get; set; } }
Now we also store a password in the MongoDB collection, but do not want to bind it to out object above. When we do a Get like so,
var query = Query<UserModel>.EQ(e => e.Email, model.Email); var entity = usersCollection.FindOne(query);
We get the following error
Element 'Password' does not match any field or property of class
Is there anyway to tell Mongo to ignore fields it cant match with the models?
-
LiamB about 10 years@l3arnon Can this be set globally?
-
Craig Wilson about 10 yearsIt can be set globally using a convention, as noted here: jira.mongodb.org/browse/CSHARP-965. We don't ignore extra elements by default because it means you are losing data, and that isn't safe.
-
Pascalsz over 6 yearsThanks.. that helped me a lot to not decorage all my poco's with the ObjectId. This way i have a clean datacontract without any mongo specific dependencies.
-
screig almost 6 yearsFYI, this only works if called BEFORE initialising the Mongo client (one day wasted).
-
jcasas over 5 yearsIn my ASP.NET Core application I need to restart the application in order for the Class Map to take effect.I first do the mappings, then populate initial data in the DB. If I don't restart I get a deserialization exception from the MongoDb C# Driver. Do you know how can I avoid the restart?
-
jcasas about 5 yearsThis solution is also very useful when the models you save on DB are from third party libraries such in this case: github.com/souzartn/IdentityServer4.Samples.Mongo
-
Craig Wayne almost 4 yearsNote, this doesn't ignore extra properties on nested properties bound to a class
-
MAGYS over 3 yearsPlease also see the comment from screig, you need to do this before create the MongoClient. (I'm not sure but I think in the last few version this was not the case)