Docs 菜单
Docs 主页
/ / /
Go 驱动程序
/ / /

指定要返回的字段

在此页面上

  • Overview
  • 样本数据
  • 投射
  • 排除字段
  • 包含一个字段
  • 聚合(Aggregation)
  • 更多信息
  • 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() 方法。如果您指定了要排除的字段,驱动程序会包含所有未显式排除在投影文档中的字段。

下面的示例从 Find() 方法返回的匹配文档中排除了 course_idenrollment 字段:

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))
}

要包含某一字段,请将要包含的字段通过 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))
}

您还可以创建一个 $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))
}

要了解有关提到的操作的更多信息,请参阅以下指南:

要了解如何从文本搜索中投影文本分数,请参阅搜索文本

要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档:

后退

限制返回结果的数量