MongoDB C#驱动程序:插入时忽略属性

MongoDB C#驱动程序:插入时忽略属性,c#,mongodb,mongodb-.net-driver,C#,Mongodb,Mongodb .net Driver,我使用的是官方的MongoDB C#Drive v0.9.1.26831,但我想知道给定一个POCO类,是否可以忽略插入的某些属性 例如,我有以下课程: public class GroceryList { public string Name { get; set; } public FacebookList Owner { get; set; } public bool IsOwner { get; set; } } 当我插入一个GroceryList对象时,是否有

我使用的是官方的MongoDB C#Drive v0.9.1.26831,但我想知道给定一个POCO类,是否可以忽略插入的某些属性

例如,我有以下课程:

public class GroceryList
{
    public string Name { get; set; }
    public FacebookList Owner { get; set; }
    public bool IsOwner { get; set; }
}
当我插入一个GroceryList对象时,是否有一种方法可以使IsOwner不被插入? 基本上,我从数据库中获取对象,然后在应用层中设置IsOwner属性,然后将其返回给控制器,然后控制器将对象映射到视图模型


希望我的问题有意义。谢谢

看来[BsonIgnore]属性完成了这项工作

public class GroceryList : MongoEntity<ObjectId>
{
    public FacebookList Owner { get; set; }
    [BsonIgnore]
    public bool IsOwner { get; set; }
}
公共类杂货店列表:MongoEntity
{
公共FacebookList所有者{get;set;}
[b索尼奥雷]
公共bool IsOwner{get;set;}
}

您还可以将
IsOwner
设为空,并将
[BsonIgnoreExtraElements]
添加到整个类中:

[BsonIgnoreExtraElements]
public class GroceryList : MongoEntity<ObjectId>
{
    public FacebookList Owner { get; set; }
    public bool? IsOwner { get; set; }
}
[BsonIgnoreExtraElements]
公共级杂货店:MongoEntity
{
公共FacebookList所有者{get;set;}
公共布尔?IsOwner{get;set;}
}
序列化期间将忽略值为
null
的属性。
但是我认为
[BsonIgnore]
更适合您的情况。

或者,如果您出于某种原因不想使用该属性(例如,如果您不想给DTO带来对
MongoDB.Bson
的额外依赖),您可以执行以下操作:

BsonClassMap.RegisterClassMap<GroceryList>(cm =>
{
  cm.AutoMap();
  cm.UnmapMember(m => m.IsOwner);
});
BsonClassMap.RegisterClassMap(cm=>
{
cm.AutoMap();
cm.取消成员(m=>m.IsOwner);
});

以防万一有人可能对另一种方法感兴趣。通过公约:

public class IgnoreSomePropertyConvention : ConventionBase, IMemberMapConvention
{
    public void Apply(BsonMemberMap memberMap)
    { // more checks will go here for the case above, e.g. type check
        if (memberMap.MemberName != "DoNotWantToSaveThis")
            memberMap.SetShouldSerializeMethod(o => false);
    }
}
然后,您需要在应用程序启动期间注册此约定一次:

ConventionRegistry.Register("MyConventions", new ConventionPack { new IgnoreBaseIdConvention()  }, t => true);

您可能希望将这两个属性BsonIgnoreExtraElements和BsonIgnore组合起来。 原因是,尽管BsonIgnore不会将“IsOwner”属性插入数据库,但如果您的数据库中有包含此字段的“旧”实例,并且您将从功能中的模型中删除此字段,或者扩展“GroceryList”类,并在数据库中使用新类,则会出现异常:

“元素'IsOwner'与类的任何字段或属性都不匹配。”

另一种方法(而不是编辑模型类)是将“注册类映射”与“SetIgnoreExtraElements”和“UnmapMember”一起使用。

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

BsonClassMap.RegisterClassMap<UserModel>(cm =>
{
     cm.AutoMap();
     cm.SetIgnoreExtraElements(true);
     cm.UnmapMember(m => m.IsOwner);
});
BsonClassMap.RegisterClassMap(cm=>
{
cm.AutoMap();
cm.SetIgnoreExtraElements(真);
cm.取消成员(m=>m.IsOwner);
});
有关Mongo类映射的更多信息,请参阅:


是的,我在IsOwner属性上使用了BsonIgnore属性,这解决了问题。谢谢如果我同时使用[BsonIgnoreExtraElements]和[BsonIgnore],那么所有具有[BsonIgnore]注释的属性都将被忽略,无论这些值是多少,而其余具有null值的属性也将被忽略。正确吗?@WSK[BsonIgnoreExtraElements]在加载文档时忽略不在类中的db中的字段。b加载/保存文档时忽略“忽略”字段。