如何在不使用 BsonIgnore 的情况下保存到 MongoDB 时跳过属性

本文关键字:MongoDB 保存 属性 情况下 BsonIgnore | 更新日期: 2023-09-27 18:26:46

我有一个类,其中包含一个字段,我想在将对象保存到MongoDB时跳过该字段。

public class Person
{
    public string name;
    public string ignorable;  // I don't want this one to be saved to the db
}

我知道 BsonIgnore 属性,但在序列化要发送到客户端 javascript 应用程序的对象时,这也忽略了该属性。

我使用官方的 C# 驱动程序,并在对象上直接调用此扩展方法以序列化为 json:

MongoDB.Bson.BsonExtensionMethods.ToJson()

如何在不使用 BsonIgnore 的情况下保存到 MongoDB 时跳过属性

另一种解决方案:可以将实体类对象强制转换为BsonDocument并调用remove方法来删除不需要的字段。最重要的是,实际上您应该在MongoCollection对象上调用Save方法,以便仅更新包含的字段。

你可以编写自己的序列化程序和反序列化程序

public class PersonSerialzer : IBsonSerializer
{
        public object Deserialize(BsonReader bsonReader, Type nominalType, IBsonSerializationOptions options)
        {
            ....
        }
        public object Deserialize(BsonReader bsonReader, Type nominalType, Type actualType, IBsonSerializationOptions options)
        {
            ....
        }
        public IBsonSerializationOptions GetDefaultSerializationOptions()
        {
            ....
        }
        public void Serialize(BsonWriter bsonWriter, Type nominalType, object value, IBsonSerializationOptions options)
        {
            var person = (Person)value;
            bsonWriter.WriteStartDocument();
            bsonWriter.WriteString("name", person.name);
            //bsonWriter.WriteString("ignorable", person.ignorable); ignore for serialize
            bsonWriter.WriteEndDocument();
        }
    }

Deserialize方法很简单Serialize方法。

然后通过以下方式注册

var ser = new PersonSerialzer();
BsonSerializer.RegisterSerializer(typeof(Person), ser);