You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB.Driver C# 无法反序列化ObjectId数组集合问题求助

解决MongoDB ObjectId数组反序列化失败的问题

你遇到的反序列化错误,核心原因是MongoDB集合中Questions字段存储的是ObjectId数组,但C#模型里定义的是List<string>——驱动默认无法自动完成ObjectId到string的转换,虽然单个ObjectId字段可以通过[BsonRepresentation(BsonType.ObjectId)]实现转换,但集合属性需要单独配置转换规则。

不需要编写自定义序列化器,有两种简单的解决方案:

方案1:给集合属性添加序列化特性

修改Test模型的Questions属性,添加[BsonRepresentation(BsonType.ObjectId)]特性,告诉驱动自动将数组中的每个ObjectId反序列化为string,同时支持将string序列化为ObjectId存入数据库:

namespace DatabaseConnector.Models
{
    public class Test
    {
        [BsonId]
        [BsonRepresentation(BsonType.ObjectId)]
        public string Id { get; set; }

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

        [BsonElement("description")]
        public string Description { get; set; }

        [BsonElement("Questions")]
        [BsonRepresentation(BsonType.ObjectId)] // 新增序列化特性
        public List<string> Questions { get; set; } = null!;
    }
}

方案2:使用ObjectId类型的集合

如果业务逻辑允许,直接将Questions的类型改为List<ObjectId>,完全贴合MongoDB的存储类型,避免类型转换的开销:

namespace DatabaseConnector.Models
{
    public class Test
    {
        [BsonId]
        [BsonRepresentation(BsonType.ObjectId)]
        public string Id { get; set; }

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

        [BsonElement("description")]
        public string Description { get; set; }

        [BsonElement("Questions")]
        public List<ObjectId> Questions { get; set; } = null!;
    }
}

需要将ObjectId转为string时,直接调用objectId.ToString()即可。

实用MongoDB资料推荐

  • MongoDB .NET驱动官方文档:重点关注「序列化与反序列化」章节,详细讲解BsonId、BsonRepresentation等核心特性的用法,以及复杂类型的序列化配置。
  • 《MongoDB实战》(中文版):适合从关系型数据库转型的开发者,覆盖文档模型设计、CRUD操作、索引优化等核心内容,帮助建立非关系型数据库的思维模式。
  • MongoDB官方博客.NET系列:包含大量针对.NET开发者的实践教程,比如模型设计最佳实践、性能调优技巧、集群操作指南等。

内容的提问来源于stack exchange,提问作者Catalin Copil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 15:47:35