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

Posted

技术标签:

【中文标题】MongoDB C# 驱动程序:在插入时忽略属性【英文标题】:MongoDB C# Driver: Ignore Property on Insert 【发布时间】:2011-02-03 23:07:30 【问题描述】:

我正在使用官方 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; 

有没有办法让 IsOwner 在我插入 GroceryList 对象时不被插入? 基本上,我从数据库中获取对象,然后在应用层设置 IsOwner 属性,然后将其返回给控制器,然后控制器将对象映射到视图模型。

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

【问题讨论】:

是的,我在 IsOwner 属性上使用了 BsonIgnore 属性,这解决了问题。谢谢! 【参考方案1】:

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

public class GroceryList : MongoEntity<ObjectId>

    public FacebookList Owner  get; set; 
    [BsonIgnore]
    public bool IsOwner  get; set; 

【讨论】:

【参考方案2】:

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

BsonClassMap.RegisterClassMap<GroceryList>(cm =>

  cm.AutoMap();
  cm.UnmapMember(m => m.IsOwner);
);

【讨论】:

【参考方案3】:

您还可以将IsOwner 设为 Nullable 并将[BsonIgnoreExtraElements] 添加到整个班级:

[BsonIgnoreExtraElements]
public class GroceryList : MongoEntity<ObjectId>

    public FacebookList Owner  get; set; 
    public bool? IsOwner  get; set; 

在序列化过程中将忽略具有null 值的属性。 但我认为[BsonIgnore] 更适合您的情况。

【讨论】:

如果我同时使用 [BsonIgnoreExtraElements] 和 [BsonIgnore] 则所有具有 [BsonIgnore] 注释的属性都将忽略,无论是否存在值,而其余具有空值的属性也将被忽略。对吗? @WSK [BsonIgnoreExtraElements] 在加载文档时忽略 db 中不在您的类中的字段。 BsonIgnore 在加载/保存文档时忽略字段。【参考方案4】:

您可能应该将 BsonIgnoreExtraElements 和 BsonIgnore 这两个属性结合起来。 原因是尽管 BsonIgnore 不会向您的数据库插入“IsOwner”属性,但如果您的数据库中有包含此字段的“旧”实例,您将从功能中的模型中删除此字段或扩展您的“GroceryList” " 类并在数据库中使用你的新类将得到一个异常:

“元素‘IsOwner’不匹配类的任何字段或属性。”

另一种方法(而不是编辑模型类)是将“Register Class Map”与“SetIgnoreExtraElements”和“UnmapMember”一起使用。

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

BsonClassMap.RegisterClassMap<UserModel>(cm =>

     cm.AutoMap();
     cm.SetIgnoreExtraElements(true);
     cm.UnmapMember(m => m.IsOwner);
);

您可以阅读更多关于 Mongo 类映射的内容:

http://mongodb.github.io/mongo-csharp-driver/2.0/reference/bson/mapping/

【讨论】:

【参考方案5】:

以防万一有人对另一种方式感兴趣。通过约定:

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

【讨论】:

以上是关于MongoDB C# 驱动程序:在插入时忽略属性的主要内容,如果未能解决你的问题,请参考以下文章

C# Newtonsoft.Json JObject移除属性,在序列化时忽略

如何使用 C# mongodb 驱动程序防止 SQL 注入?

MongoDB - 使用 C# 驱动程序按日期和时间搜索

使用官方 C# 驱动程序在 Mongo DB 中进行更新插入

uvc无驱摄像头怎么连接电脑

如何使用 C# 驱动程序在 MongoDB 中更新和更新多个文档