将文档保存在MongoDB中,而不会破坏以前对子文档的部分更新

时间:2011-11-20 20:08:40

标签: .net mongodb mongodb-.net-driver

假设我有这样的模型:

public class Item
{
    public Guid Id { get;set;}
    public string Title { get;set;}
    public List<Comment> Comments { get;set;}
}

使用官方驱动程序保存到Mongo时,注释最终将作为嵌入式子文档。我不希望有人添加注释来要求保存整个文档,所以我写了一个原子部分更新方法:

public void AddComment(Item item, Comment comment)
{           
    Collection.Update(
        Query.EQ("_id", item.Id), 
        Update.AddToSet("Comments", 
        BsonValue.Create(comment)));
}

但是,我不确定如何为Mongo驱动程序指定使用这些就地更新维护“注释”,并且如果在父文档上调用Save()则不应该保留。

我可以用属性装饰属性吗?或者我将被迫编写一个更新方法,指定我想要手动更新的所有属性。

1 个答案:

答案 0 :(得分:1)

您可以在项目类中指定ShouldSerializeXyz方法,如下所示:

public bool ShouldSerializeComments() {
    return false;
} 

然后当你保存对象时,驱动程序永远不会序列化注释。

或者另一个选项是在保存之前将注释设置为null并使用BsonIgnoreIfNull属性

public class Item
{
    ...
    [BsonIgnoreIfNull]
    public List<Comment> Comments { get;set;}
}

...

obj.Comments = null;
collection.Save(obj);