.NET Core C# MongoDB Driver无法获取集合全部文档求助
问题背景
在.NET Core Blazor Server应用中使用2.25版本的MongoDB C#驱动,通过Linq查询和Find方法获取集合文档时,结果均比MongoDB Shell中执行对应聚合查询少18条。数据库为运行3年的Atlas免费集群,刚接触该驱动,需排查原因。
用到的代码
Linq查询代码:
var riesgosCollection = _mongoDatabase.GetCollection<Riesgo_Lista>("riesgos"); var riesgosQueryableCollection = riesgosCollection.AsQueryable(); var query = riesgosQueryableCollection.Select(r => new { r.Numero }); var lista2 = await query.ToListAsync();
Find方法代码:
var mongodbCollection = _mongoDatabase.GetCollection<BsonDocument>("riesgos"); var filter = Builders<BsonDocument>.Filter.Empty; List<BsonDocument>? riesgos2; riesgos2 = await mongodbCollection.Find(filter).ToListAsync();
Linq转换后的聚合语句:
scrwebm_arsa.riesgos.Aggregate([{ "$project" : { "Numero" : "$numero", "_id" : 0 } }])
排查步骤
检查读写配置差异
Atlas免费集群默认的读取关注点(read concern)可能和驱动默认值不同。Shell默认用local,驱动可能默认majority,导致读取到的是已提交的多数节点确认数据,而Shell可能读到未完全同步的文档。可以在查询时显式指定读取关注点:var findOptions = new FindOptions { ReadConcern = ReadConcern.Local }; var riesgos2 = await mongodbCollection.Find(filter, findOptions).ToListAsync();同时确认连接字符串是否强制读取主节点,避免从节点延迟导致数据不一致:
mongodb+srv://<user>:<password>@cluster0.mongodb.net/?readPreference=primary验证权限范围
检查应用所用的数据库用户是否拥有该集合的全量读取权限,是否存在文档级或字段级权限限制,导致部分文档无法被驱动读取。对比驱动直接执行Shell聚合的结果
将Shell中执行的聚合语句直接通过驱动执行,对比结果数量:var pipeline = new BsonDocument[] { new BsonDocument("$project", new BsonDocument("Numero", "$numero").Add("_id", 0)) }; var aggregateResult = await mongodbCollection.Aggregate<BsonDocument>(pipeline).ToListAsync();如果该结果和Shell一致,说明Linq的查询转换存在问题;如果仍然少18条,说明是驱动与Shell的连接或配置差异导致。
排查序列化/反序列化问题(针对强类型查询)
检查Riesgo_Lista类的Numero属性是否正确映射MongoDB中的numero字段,需添加[BsonElement("numero")]标注:public class Riesgo_Lista { [BsonElement("numero")] public string Numero { get; set; } // 其他属性... }不过由于Find方法用
BsonDocument结果也少,该点优先级较低,但仍需验证。检查全局过滤或软删除逻辑
确认驱动是否配置了全局过滤器(比如在MongoClientSettings中添加了默认过滤条件),同时检查集合中是否存在软删除标记(如isDeleted: true),Shell查询是否包含了这些文档而驱动代码未处理。升级驱动版本
2.25版本的MongoDB C#驱动较旧,可能与Atlas集群的MongoDB版本存在兼容性问题。尝试升级到2.29.x版本(2.x分支的最新稳定版),验证问题是否解决。
内容的提问来源于stack exchange,提问作者Manuel Rivera

