Overview
在本指南中,您可以了解如何使用投影指定从读取操作中返回哪些字段。 投影是指定 MongoDB 从查询中返回哪些字段的文档。
样本数据
sample_mflix.movies本页上的示例使用 Atlas示例数据集中的 集合。要学习;了解如何创建免费的MongoDB Atlas 群集并加载示例数据集,请参阅  .NET/ C#驱动程序入门。
以下类表示 sample_mflix.movies集合中的文档:
public class Movie {     public ObjectId Id { get; set; }     public string Title { get; set; }     public List<string> Genres { get; set; }     public string Type { get; set; }     public string Plot { get; set; }     public List<BsonDocument> Highlights { get; set; }          public string Score { get; set; }     []     public SearchScoreDetails ScoreDetails { get; set; }          []     public SearchScoreDetails SearchScoreDetails { get; set; }           []     public string PaginationToken { get; set; }          public List<string> Cast { get; set; }          []     public float[] PlotEmbedding { get; set; } } 
注意
用于 Pascal Case 的 ConventionPack
上述类中的属性以 Pascal 大小写命名,但MongoDB集合中的字段名称使用驼峰式大小写。为了解决这种差异,您可以使用以下代码在应用程序启动时注册 ConventionPack:
var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true); 
创建投影
要创建投影,请执行以下步骤:
- 使用 - Builders<TDocument>.Projection静态属性创建- ProjectionDefinitionBuilder<TDocument>对象,其中- TDocument表示集合文档映射到的C#类。- ProjectionDefinitionBuilder类提供用于定义投影的类型安全接口。
- ProjectionDefinitionBuilder<TDocument>对象中的链式投影方法,用于指定要在返回的文档中包含或排除哪些字段。
- 将生成的 - ProjectionDefinition<TDocument>对象存储在变量中。
- 执行查找或聚合操作后,将变量传递给 - Project()方法。
以下部分描述了您可以从 ProjectionDefinitionBuilder<TDocument>对象链接的方法。
字段投影方法
使用以下方法可以指定要在返回的文档中包含或排除哪些字段。
ElemMatch
ElemMatch() 方法将查询结果中大量字段的内容限制为仅包含与指定条件匹配的第一个元素。这相当于使用MongoDB查询API中的 $elemMatch操作符投影大量元素。
有关使用 ElemMatch() 方法的代码示例,请参阅MongoDB Server手册中的 $elemMatch。
表达式(expression)
Expression() 方法允许您使用Lambda表达式指定返回文档的结构。 这相当于在MongoDB查询API 的$project聚合阶段指定返回文档的结构。
有关使用 Expression() 方法的代码示例,请参阅 MongoDB Server 手册中的 $ 项目。
注意
排除 Id 字段
当您使用Lambda表达式创建投影时,输出会自动排除 Id字段,除非您明确包含该字段。
Exclude
Exclude() 方法允许您指定要从返回的文档中排除的字段。这相当于在MongoDB Query API的 $project聚合阶段排除一个字段。除非要排除 _id字段,否则不能在单个投影中组合包含和排除语句。
有关使用 Exclude() 方法的代码示例,请参阅 MongoDB Server 手册中的 $ 项目。
注意
显式排除_id字段
除非您明确排除,否则返回的文档包含 _id字段。唯一的例外是使用 Expression() 方法创建投影时。
包括
Include() 方法允许您指定要包含在返回的文档中的字段。这相当于在MongoDB Query API 的$project聚合阶段包含一个字段。
有关使用 Include() 方法的代码示例,请参阅 MongoDB Server 手册中的 $ 项目。
Slice
Slice() 方法指定要在查询结果字段中返回的列表或大量的元素数量。这相当于在MongoDB查询API中使用 $slice操作符符。
以下代码示例使用 Slice() 方法返回所返回文档的 cast大量中 Cast 列表的前三个元素:
var filter = Builders<Movie>.Filter.Text("future"); var projection = Builders<Movie>     .Projection     .Slice(m => m.Cast, 3)     .Include(m => m.Cast); var results = movieCollection.Find(filter)     .Project(projection)     .Limit(1)     .ToList(); 
{   "_id": {     "$oid": "573a1398f29313caabceb500"   },   "title": "Back to the Future Part II",   "cast": [     "Michael J. Fox",     "Christopher Lloyd",     "Lea Thompson"   ] } 
要从集合末尾返回元素,请将负整数传递给 Slice() 方法。以下代码示例返回所返回文档的 cast大量中 Cast 列表的最后三个元素:
var filter = Builders<Movie>.Filter.Text("future"); var projection = Builders<Movie>     .Projection     .Slice(m => m.Cast, -3)     .Include(m => m.Title); var results = movieCollection.Find(filter)     .Project(projection)     .Limit(1)     .ToList(); 
{   "_id": {     "$oid": "573a1398f29313caabceb500"   },   "title": "Back to the Future Part II",   "cast": [     "Lea Thompson",     "Thomas F. Wilson"   ] } 
要跳过集合中指定数量的元素,请将要跳过的元素数量作为第一个参数传递,并将要返回的元素数量作为第二个参数传递。以下代码示例会跳过 Cast 列表中的第一个元素,并返回 cast大量中的后三个元素:
var filter = Builders<Movie>.Filter.Text("future"); var projection = Builders<Movie>     .Projection     .Slice(m => m.Cast, 1, 3)      .Include(m => m.Title); var results = movieCollection.Find(filter)     .Project(projection)     .Limit(1)     .ToList(); 
{   "_id": {     "$oid": "573a1398f29313caabceb500"   },   "title": "Back to the Future Part II",   "cast": [     "Christopher Lloyd",     "Lea Thompson",     "Thomas F. Wilson"   ] } 
要学习;了解有关 $slice操作符的更多信息,请参阅MongoDB Server手册中的 $slice。
元数据投影方法
使用以下方法可以指定要在返回的文档中包含或排除哪些元数据字段。元数据字段默认处于隐藏状态。
Meta
Meta() 方法允许您指定要包含在返回的文档中的元数据字段。这相当于在MongoDB查询API中使用$meta操作符包含元数据字段。
以下代码示例将 textScore 元元数据字段作为名为 score 的字段添加到返回的文档中:
var filter = Builders<Movie>.Filter.Text("future"); var projection = Builders<Movie>.Projection     .Include(m => m.Title)     .Include(m => m.Plot)     .Meta(field: "score", metaFieldName: "textScore"); var results = movieCollection.Find(filter)     .Project(projection)     .Limit(1)     .ToList(); 
{   "_id": {     "$oid": "..."   },   "plot": "...",   "title": "...",   "score": "..." } 
MetaSearchHighlights
注意
仅限MongoDB搜索
此方法仅在投影MongoDB搜索的结果时可用。
MetaSearchHighlights() 在返回的文档中包含搜索亮点。这相当于在MongoDB查询API中使用 { "$meta": "searchHighlights" }对象来投影搜索亮点。要检索搜索集锦,您必须创建指定搜索字段的 SearchHighlightOptions对象,然后将该对象传递给 Search() 方法。
以下代码示例检索 plot字段的搜索突出显示,然后将这些突出显示包含在返回的文档中名为 Highlights 的属性中:
var filter = Builders<Movie>.Search.Text(path: m => m.Plot, query: "future"); var projection = Builders<Movie>.Projection     .Include(m => m.Title)     .Include(m => m.Plot)     .MetaSearchHighlights(m => m.Highlights); var results = movieCollection     .Aggregate()     .Search(filter, new SearchHighlightOptions<Movie> (m => m.Plot))     .Project(projection)     .Limit(1)     .ToList(); 
{   "_id": {     "$oid": "573a13def29313caabdb5661"   },   "plot": "She Can See Her Future, But Can't Escape Her Past.",   "title": "West",   "highlights": [     {       "score": 1.286744475364685,       "path": "plot",       "texts": [         {           "value": "She Can See Her ",           "type": "text"         },         {           "value": "Future",           "type": "hit"         },         {           "value": ", But Can't Escape Her Past.",           "type": "text"         }       ]     }   ] } 
要学习;了解有关搜索突出显示的更多信息,请参阅Atlas文档中的在结果中突出显示搜索词。
MetaSearchScore
注意
仅限MongoDB搜索
此方法仅在投影MongoDB搜索的结果时可用。
MetaSearchScore() 方法在返回的文档中包含搜索分数。这相当于使用MongoDB查询API中的 { "$meta": "searchScore" }对象来投影搜索分数。
以下代码示例将每个文档的搜索分数投影到名为 score 的字段中:
var filter = Builders<Movie>.Search.Text(m => m.Plot, "future"); var projection = Builders<Movie>.Projection     .Include(m => m.Title)     .Include(m => m.Plot)     .MetaSearchScore(m => m.Score); var results = movieCollection     .Aggregate()     .Search(filter)      .Project(projection)     .Limit(1)     .ToList(); 
{   "_id": {     "$oid": "573a13def29313caabdb5661"   },   "plot": "She Can See Her Future, But Can't Escape Her Past.",   "title": "West",   "score": 2.8259084224700928 } 
要学习;了解有关搜索分数的更多信息,请参阅对结果中的文档进行评分。
MetaSearchScoreDetails
注意
仅限MongoDB搜索
此方法仅在投影MongoDB搜索的结果时可用。
MetaSearchScoreDetails() 包含有关返回文档中搜索分数的详细信息。这相当于使用MongoDB查询API中的 { "$meta": "searchScoreDetails" }对象来投影搜索分数详细信息。
要检索分数详细信息,请创建一个 SearchOptions对象,将其 ScoreDetails属性设立为 true,然后将该对象传递给 Search() 方法。以下代码示例通过将每个文档的搜索分数详细信息投影到名为 searchScoreDetails 的字段中来展示此进程:
var filter = Builders<Movie>.Search.Text(m => m.Plot, "future"); var projection = Builders<Movie>.Projection     .Include(m => m.Title)     .Include(m => m.Plot)     .MetaSearchScore(m => m.Score)     .MetaSearchScoreDetails(m => m.SearchScoreDetails); var results = movieCollection     .Aggregate()     .Search(filter, new SearchOptions<Movie>() { ScoreDetails = true})      .Project(projection)     .Limit(1)     .ToList(); 
{   "_id": {     "$oid": "573a13def29313caabdb5661"   },   ...   "scoreDetails": {     "value": 2.8259084224700928,     "description": "$type:string/plot:future [BM25Similarity], result of:",     "details": [       {         "value": 2.8259084224700928,         "description": "score(freq=1.0), computed as boost * idf * tf from:",         "details": [          ... } 
MetaTextScore
MetaTextScore() 方法会在返回的文档中包含 $text搜索分数。这相当于使用MongoDB查询API中的 { "$meta": "textScore" }对象来投影文本搜索分数。
有关使用 MetaTextScore() 方法的代码示例,请参阅MongoDB Server手册中的 $meta。
MetaVectorSearchScore
注意
仅限MongoDB Vector Search
此方法仅在投影MongoDB Vector Search 的结果时可用。
MetaVectorSearchScore() 方法在返回的文档中包含MongoDB Vector Search 分数。这相当于使用MongoDB查询API中的 { "$meta": "vectorSearchScore" }对象来投影向量搜索分数。
要学习;了解有关MongoDB Vector Search 分数的更多信息,请参阅Atlas文档中的对结果中的文档进行评分。
searchMeta
注意
仅限MongoDB搜索
此方法仅在投影MongoDB搜索的结果时可用。
SearchMeta() 方法包含元数据结果文档。此文档的结构取决于结果的类型。这相当于使用MongoDB查询API中的 $searchMeta聚合阶段或 $$SEARCH_META聚合变量来投影元数据结果文档。
SearchMeta()有关使用 方法的代码示例,请参阅Atlas文档中的如何在MongoDB Search 中使用分面。
要学习;了解有关 $searchMeta 和 $$SEARCH_META 的更多信息,请参阅以下Atlas文档:
API 文档
要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档: