指定要返回的字段
Overview
在本指南中,您可以了解如何指定在文档中返回哪些字段。
样本数据
本部分的示例使用以下 Course
结构作为 courses
集合中文档的模型:
type Course struct { Title string `bson:"title,omitempty"` CourseId string `bson:"course_id,omitempty"` Enrollment int32 `bson:"enrollment,omitempty"` }
omitempty
结构标签指示驱动程序在根据投影规范取消封送时排除字段。
要运行本部分中的示例,请使用以下代码段将样本数据加载到 db.courses
集合中:
coll := client.Database("db").Collection("courses") docs := []interface{}{ Course{Title: "Primate Behavior", CourseId: "PSY2030", Enrollment: 40}, Course{Title: "Revolution and Reform", CourseId: "HIST3080", Enrollment: 12}, } result, err := coll.InsertMany(context.TODO(), docs)
提示
不存在的数据库和集合
如果执行写操作时不存在必要的数据库和集合,服务器会隐式创建这些数据库和集合。
每个文档均包含某一大学课程的说明,其中包括课程标题、课程 ID 和最大注册人数,而它们分别对应于每个文档中的 title
、course_id
和 enrollment
字段。
投射
投影指定要在匹配文档中返回的字段。投影文档包含带有 1
的字段名称以包含相应的字段,或使用 0
来排除该字段。如果你正在使用聚合框架,还可以指定投影以包含新计算的字段。
可以通过将投影文档传递给 SetProjection()
方法来指定投影。以下操作将选项对象作为参数:
Find()
FindOne()
FindOneAndDelete()
FindOneAndReplace()
FindOneAndUpdate()
提示
如果未指定投影,则此操作会返回匹配文档中的所有字段。
排除字段
要排除某一字段,请将要排除的字段通过 0
传递给 SetProjection()
方法。如果您指定了要排除的字段,驱动程序会包含所有未显式排除在投影文档中的字段。
例子
下面的示例从 Find()
方法返回的匹配文档中排除了 course_id
和 enrollment
字段:
filter := bson.D{} opts := options.Find().SetProjection(bson.D{{"course_id", 0}, {"enrollment", 0}}) cursor, err := coll.Find(context.TODO(), filter, opts) if err != nil { panic(err) } var results []Course if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res)) }
{"title":"Primate Behavior"} {"title":"Revolution and Reform"}
包含一个字段
要包含某一字段,请将要包含的字段通过 1
传递给 SetProjection()
方法。如果您指定了要包含的字段,驱动程序则会排除所有未显式包含在投影文档中的字段。
例子
下面的示例仅包含 Find()
方法返回的匹配文档中的 title
和 enrollment
字段:
filter := bson.D{} opts := options.Find().SetProjection(bson.D{{"title", 1}, {"enrollment", 1}}) cursor, err := coll.Find(context.TODO(), filter, opts) if err != nil { panic(err) } var results []Course if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res)) }
{"title":"Primate Behavior","enrollment":40} {"title":"Revolution and Reform","enrollment":12}
聚合(Aggregation)
您还可以创建一个 $project 阶段, 以在聚合管道中指定一个投影。
例子
下面的示例仅包含 Aggregate()
方法返回的匹配文档中的 title
和 course_id
字段:
projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"course_id", 1}}}} cursor, err := coll.Aggregate(context.TODO(), mongo.Pipeline{projectStage}) if err != nil { panic(err) } var results []Course if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res)) }
{"title":"Primate Behavior","course_id":"PSY2030"} {"title":"Revolution and Reform","course_id":"HIST3080"}
更多信息
要了解有关提到的操作的更多信息,请参阅以下指南:
要了解如何从文本搜索中投影文本分数,请参阅搜索文本。
API 文档
要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档: