首页 > 解决方案 > Mongodb C# 驱动程序抛出元素名称“_t”在 UpdateOneAsync 上无效

问题描述

我得到 MongoDb.Bson.SerializationException: 'Element name '_t' is not valid。我首先在线阅读了所有看起来类似问题的帖子,但是,在这些帖子中,指定了元素名称,在这里,即使尝试不同的类对象,我也只会得到“_t”。

        var database = AppConfig.client.GetDatabase("test");
        var collection = database.GetCollection<BsonDocument>("testcollection");

        var filter = Builders<Student>.Filter.Eq(g => g.Name, "oldName");
        

        var update = Builders<Student>.Update.Set(g => g.Name, "NewName");

        var updateResult = await collection.UpdateOneAsync(filter.ToBsonDocument(), update.ToBsonDocument());

此外,对于我在网上看到的 UpdateOneAsync 函数的所有示例,下面的过滤器和更新不需要是 BSON 文档,但是,除非我像上面那样执行 .ToBSONDocument() ,否则我的代码不会编译。

var updateResult = await collection.UpdateOneAsync(filter, update);

我的课很少:

    public class Student
    {
      [BsonElement("Name")]
      public string Name { get; set; }

      [BsonElement("Age")]
      public int Age { get; set; }
    
     }

有人可以帮忙弄清楚上面有什么问题吗?

更新:如何为 Update.Set 使用渲染

        var registry = BsonSerializer.SerializerRegistry;
        var serializer = registry.GetSerializer<Student>();

        var filter = Builders<Student>.Filter.Eq(g=> g.Name, "NewName").Render(serializer, registry);

//我认为更新语法不正确。

        var update = Builders<Student>.Update.Set(g => g.Name, "Changed").Render(serializer, registry);


//update is throwing error:cannot convert from Mongodb.bson.bsonvalue to mongodb.Driver.updatedefinition<MongoDB.Bson.BsonDocument
            var updateResult = await collection.UpdateOneAsync(filter, update);

标签: c#.netmongodbmongodb-.net-driver

解决方案


不可能ToBsonDocument像你一样使用。最简单的解决方法是使用非类型化构建器:

var filter = Builders<BsonDocument>.Filter.Eq("name", "oldName");

如果你想使用类型化的构建器,你应该调用Render如下:

        var registry = BsonSerializer.SerializerRegistry;
        var serializer = registry.GetSerializer<Student>();
        var filter = Builders<Student>.Filter.Eq(e=>e.Name, "oldName").Render(serializer, registry);

推荐阅读