MongoDB C#驱动程序 - 忽略绑定上的字段

Lia*_*amB 60 .net c# mongodb mongodb-query mongodb-.net-driver

使用MongoDB和C#的FindOne()时,有没有办法忽略对象中找不到的字段?

EG,示例模型.

public class UserModel
{
    public ObjectId id { get; set; }
    public string Email { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在我们还在MongoDB集合中存储密码,但不想将其绑定到上面的out对象.当我们这样做的时候,

  var query = Query<UserModel>.EQ(e => e.Email, model.Email);
  var entity = usersCollection.FindOne(query);
Run Code Online (Sandbox Code Playgroud)

我们收到以下错误

Element 'Password' does not match any field or property of class 
Run Code Online (Sandbox Code Playgroud)

反正有没有告诉Mongo忽略它与模型不匹配的字段?

i3a*_*non 110

是.只需UserModel使用以下BsonIgnoreExtraElements属性装饰您的类:

[BsonIgnoreExtraElements]
public class UserModel
{
    public ObjectId id { get; set; }
    public string Email { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

顾名思义,驱动程序会忽略任何额外的字段而不是抛出异常.更多信息 - 忽略额外元素.

  • 它可以使用约定进行全局设置,如下所示:https://jira.mongodb.org/browse/CSHARP-965.默认情况下,我们不会忽略额外的元素,因为这意味着您正在丢失数据,这是不安全的. (5认同)

Vet*_*ras 29

另一种可能的解决方案是为此注册一个约定.

这样,我们就不必使用[BsonIgnoreExtraElements]注释所有类.

在创建mongo客户端时,请设置以下内容:

        var pack = new ConventionPack();
        pack.Add(new IgnoreExtraElementsConvention(true));
        ConventionRegistry.Register("My Solution Conventions", pack, t => true);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢..这帮助我很多不用ObjectId来装饰我所有的poco.这样我有一个干净的datacontract没有任何mongo特定的依赖项. (5认同)
  • 当您保存在 DB 上的模型来自第三方库时,此解决方案也非常有用,例如在这种情况下:https://github.com/souzartn/IdentityServer4.Samples.Mongo (2认同)

Avi*_*ger 18

是.另一种方法(而不是编辑你的模型类)是使用RegisterClassMapSetIgnoreExtraElements.

在您的情况下,只需在初始化驱动程序时添加此代码:

BsonClassMap.RegisterClassMap<UserModel>(cm =>
{
     cm.AutoMap();
     cm.SetIgnoreExtraElements(true);
});
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读有关使用类映射忽略额外元素的更多信息 - 忽略额外元素.

  • 仅供参考,只有在初始化Mongo客户端之前调用它(浪费一天). (6认同)
  • 请注意,这不会忽略绑定到类的嵌套属性上的额外属性 (2认同)