C#中MongoDB Projection代码实现及相关技术问询
关于MongoDB C#查询投影代码的分析与优化
我来帮你拆解这段MongoDB查询投影的代码问题哈~
首先看你写的代码,核心逻辑是查询Book集合,只返回name字段(排除了_id),然后把结果转成Book类的列表。这里有个容易踩的坑:
你在foreach里打印b._id的时候,会发现输出的都是0,而不是数据库里存储的真实_id值。这是因为你用Exclude("_id")告诉MongoDB不要返回这个字段,所以C#在创建Book实例时,_id字段会被初始化为int类型的默认值0,自然打印不出真实数据。
下面给你几个实用的优化方案,按需选择:
方案1:用DTO/匿名类型接收结果(最推荐)
如果只需要name字段,没必要用完整的Book类来接收,定义一个只包含所需字段的DTO类,类型更安全:
// 新增一个专门用于投影的DTO类 public class BookNameDto { public string name { get; set; } } // 查询时用这个DTO接收投影结果 var x = CBook.Find(new BsonDocument()) .Project(Builders<Book>.Projection.Include("name").Exclude("_id")) .As<BookNameDto>() .ToList(); foreach (BookNameDto b in x) { Console.WriteLine(b.name); // 只打印需要的name字段,避免无效的_id输出 }
如果不想额外定义类,也可以用匿名类型快速实现:
var x = CBook.Find(new BsonDocument()) .Project(Builders<Book>.Projection.Include("name").Exclude("_id")) .As<dynamic>() .ToList(); foreach (var b in x) { Console.WriteLine(b.name); }
方案2:调整投影逻辑,保留_id
如果你其实需要获取_id,只是误加了Exclude("_id"),那直接去掉这个方法就行——MongoDB默认会返回_id字段,除非你显式排除:
var x = CBook.Find(new BsonDocument()) .Project(Builders<Book>.Projection.Include("name")) .ToList(); foreach(Book b in x) { Console.WriteLine(b._id); // 这里就能输出数据库里的真实_id了 Console.WriteLine(b.name); }
方案3:用LINQ语法实现投影(更符合C#习惯)
MongoDB驱动支持LINQ查询,写起来更直观易懂,代码可读性更高:
// 只选择name字段 var x = CBook.Find(_ => true) .Select(book => new { book.name }) .ToList(); foreach (var b in x) { Console.WriteLine(b.name); } // 如果需要同时获取_id,就改成: // .Select(book => new { book._id, book.name })
内容的提问来源于stack exchange,提问作者Manisha P
相关产品推荐
相关产品推荐

