C# 操作MongoDB按ID查询已存在文档始终返回null如何解决?
问题原因定位及解决方案
核心问题1:Bson序列化特性未生效
你将[BsonId]、[BsonRepresentation(BsonType.ObjectId)]两个特性标注在了IDocument接口的Id属性上,MongoDB .NET驱动默认不会继承接口上的序列化特性,只会读取实现类Documents的属性上的特性,导致你实体类的Id字段没有被正确映射为MongoDB的_id主键,且类型映射关系失效。
核心问题2:查询时类型不匹配
数据库中存储的_id是ObjectId类型,而你查询时直接传入string类型的itemId进行匹配,MongoDB会严格校验字段类型,不同类型的字段值不会匹配成功,因此查询返回null。
解决方案
步骤1:修正实体类特性配置
将Bson主键相关特性移到Documents实现类的Id属性上:
public class Documents: IDocument { [BsonId(IdGenerator = typeof(BsonObjectIdGenerator))] [BsonRepresentation(BsonType.ObjectId)] public string Id { get; set; } public DateTime CreatedAt => DateTime.UtcNow; public Documents() { Id = ObjectId.GenerateNewId().ToString(); } }
步骤2:修正查询过滤条件(可选,若暂时不想改实体类可单独用这个方案验证)
查询时将字符串类型的id转为ObjectId后再匹配:
var filter = Builders<CandidateAnswer>.Filter.Eq(doc => doc.Id, ObjectId.Parse(itemId));
其他排查项
- 确认你打印输出的
itemId和数据库中对应_id的字符串完全一致,无多余空格、换行等特殊字符 - 确认连接字符串端口27018是正确的Mongo实例端口,没有连错环境
- 确认你操作的数据库名、集合名大小写和实际存储完全一致
- 可临时移除连接字符串中的
readPreference=nearest参数,直连主节点查询,排除从节点数据未同步的问题
内容的提问来源于stack exchange,提问作者Tharindu Sandaruwan
相关产品推荐
相关产品推荐

