文档菜单
文档首页
/ / /
Go 驱动
/ / /

指定返回的字段

在本页

  • 概述
  • 示例数据
  • 投影
  • 排除字段
  • 包含字段
  • 聚合
  • 附加信息
  • API文档

在本指南中,您可以了解如何指定在文档中返回哪些字段。

本指南中的示例使用以下内容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 和最大入学人数,对应于每个文档中的 titlecourse_idenrollment 字段。

投影指定在匹配的文档中返回哪些字段。投影文档包含具有 1 的字段名称以包含相应的字段,或具有 0 以排除它。如果您使用聚合框架,还可以指定投影以包含新计算的字段。

您可以通过传递一个投影文档给 SetProjection() 方法来指定一个投影。以下操作将一个选项对象作为参数:

  • Find()

  • FindOne()

  • FindOneAndDelete()

  • FindOneAndReplace()

  • FindOneAndUpdate()

提示

如果您未指定投影,则操作返回匹配文档中的所有字段。

要排除一个字段,请将您想排除的字段与一个 0 一起传递给 SetProjection() 方法。如果指定了要排除的字段,驱动程序将包含投影文档中明确排除的所有字段。

以下示例排除了 course_idenrollment 字段,这些字段是由 Find() 方法返回的匹配文档中的。

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() 方法返回的匹配文档中的 titleenrollment 字段

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}

您还可以创建一个$project 阶段,以在聚合管道中指定投影

以下示例仅包括由 Aggregate() 方法返回的匹配文档中的 titlecourse_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文档

返回

限制结果