Mongodb .net driver Don';序列化BSON时是否覆盖额外字段?

Mongodb .net driver Don';序列化BSON时是否覆盖额外字段?,mongodb-.net-driver,Mongodb .net Driver,我正在使用MongoDB的C#驱动程序,并试图编辑一些MongoDB元素。当反序列化BSON时,我使用[IgnoreExtraElements]标记过滤掉我并不真正关心编辑的字段。问题是当我试图将元素序列化回Mongo数据库时。将元素序列化回覆盖整个对象,而不是只更改我编辑的字段 例如,我正在更改具有C#属性的Word元素: [BsonId] public ObjectId _id; public string word; 在MongoDB中,它还有元素“conjugations”,这是一种我

我正在使用MongoDB的C#驱动程序,并试图编辑一些MongoDB元素。当反序列化BSON时,我使用[IgnoreExtraElements]标记过滤掉我并不真正关心编辑的字段。问题是当我试图将元素序列化回Mongo数据库时。将元素序列化回覆盖整个对象,而不是只更改我编辑的字段

例如,我正在更改具有C#属性的Word元素:

[BsonId]
public ObjectId _id;
public string word;
在MongoDB中,它还有元素“conjugations”,这是一种我不想序列化或弄乱的复杂数组。但当我尝试类似于下面代码的东西时,它会清空共轭数组

MongoWord word = collection.FindOneAs<MongoWord>(Query.EQ("word","hello"));
word.word = "world";
collection.Save(word);
mongowordword=collection.FindOneAs(Query.EQ(“word”,“hello”));
word.word=“世界”;
收集。保存(word);

如何避免覆盖Json数据库中的额外字段?现在我正在尝试编写一个Update.Set builder查询,只更新我使用反射/泛型更改的字段。。是否有一些简单的设置,比如我在这里缺少的反向[IgnoreExtraElements]或更新设置?

这就是为什么必须手动指定IgnoreExtraElements。您实际上是在选择可能丢失的数据


正确的处理方法是实际支持额外的元素。您可以在文档中看到如何执行此操作的这一部分:

这是我最后使用的函数。我不想使用[BsonExtraElements],因为如果没有编辑,似乎没有必要下拉ExtraElements来再次保存它们。相反,我使用mongo UpdateBuilder只更新我从mongo更改/删除的字段。如果我需要通过将字段设置为null来清除字段,那么解决方案是有问题的

    /// <summary>
    /// Update a Mongo object without overwriting columns C# think are null or doesn't know about
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="model">The mongo object to update</param>
    /// <param name="collection">The collection the object should go in</param>
    /// <param name="objectId">The Bson ObjectId of the existing object in collection</param>
    public void UpdateNotNullColumns<T>(T model, MongoCollection<T> collection, ObjectId objectId)
    {
        if (objectId==default(ObjectId))
        {
            return;
        }
        else
        {
            //Build an update query with all the non null fields using reflection
            Type type = model.GetType();
            FieldInfo[] fields = type.GetFields();
            UpdateBuilder builder = new UpdateBuilder();
            foreach(var field in fields)
            {
                BsonValue bsonValue = BsonValue.Create(field.GetValue(model));
                if(bsonValue!=null)
                {
                    Type bsonType = bsonValue.GetType();
                    builder.Set(field.Name, bsonValue);
                }
            }
            //Actually update!
            collection.Update(Query.EQ("_id", objectId), builder);
        }
    }
//
///更新Mongo对象而不覆盖C#think为null或不知道的列
/// 
/// 
///要更新的mongo对象
///对象应放入的集合
///集合中现有对象的Bson对象ID
public void UpdateNotNullColumns(T模型、MongoCollection集合、ObjectId ObjectId)
{
如果(objectId==默认值(objectId))
{
回来
}
其他的
{
//使用反射构建包含所有非空字段的更新查询
Type Type=model.GetType();
FieldInfo[]fields=type.GetFields();
UpdateBuilder=new UpdateBuilder();
foreach(字段中的变量字段)
{
BsonValue-BsonValue=BsonValue.Create(field.GetValue(model));
如果(bsonValue!=null)
{
类型bsonType=bsonValue.GetType();
builder.Set(field.Name,bsonValue);
}
}
//实际更新!
collection.Update(Query.EQ(“\u id”,objectId),builder);
}
}

谢谢你的回答!这绝对是解决我问题的最简单的方法,也是我问这个问题时想要的。从那以后,我设法用通用解决方案解决了大多数问题,(我认为它更有效),所以我正在使用它。