对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

最佳实践

使用 Atlas Go SDK 时请遵循这些最佳实践。

访问响应时,请使用 getter 函数,而不是直接字段访问。

例如,使用response.GetField()而不是response.Field

使用 getter 函数可以实现无缝指针处理,并有助于防止严重错误。 此外,Atlas Go SDK 还提供了用于安全字段修改的SetIsSetUnset方法。

当模型包含指向string的指针时,Atlas Go SDK 会将该值发送到服务器,即使它被设置为空字符串 ( "" )。

而不是直接赋值:

// Surrounding code omitted for brevity
test := ""
requestBody.StringPointerValue = test

在分配字符串之前,用户应始终检查是否有空字符串:

// Surrounding code omitted for brevity
if test != ""
requestBody.StringPointerValue = test

在 Atlas Go SDK 中, *time.Time类型表示用于处理时间相关数据的日期字段。 当您基于time.Time比较值时,要么永远不要直接比较指针,要么执行以下操作:

  • 避免使用直接比较操作符(例如myStruct.MyDateField == "" )来检查是否相等。 直接比较指针将检查它们是否引用相同的内存地址,而不是比较实际的日期值。 由于每个time.Time实例都分配在不同的内存位置,因此直接比较可能会产生意外结果。

  • 使用Has函数检查非零指针:SDK 为每个模型提供了专用的HasFieldNameGetFieldName函数,以便在访问time.Time指针的值之前检查其是否为非零。 在执行任何操作之前,始终使用此函数确保指针有效。

  • 使用time.Time方法比较日期值:确认time.Time pointer不为零后,可以安全地使用time.Time方法比较实际日期值。 常用的比较方法包括BeforeAfterEqual

// Surrounding code omitted for brevity
if !sdkModel.HasSomeDateField() {
return;
}
datePtr1 := sdkModel.SomeDateField;
if datePtr1.Before(*datePtr2) {
// datePtr1 is before datePtr2.
} else if datePtr1.After(*datePtr2) {
// datePtr1 is after datePtr2.
} else {
// datePtr1 and datePtr2 are equal.
}

Atlas Go SDK 在模型和参数中表示具有Go ìnterface{} 类型的自由格式对象。 自由形式对象包括任何形状的对象。

Go语言(Golang) ìnterface{}类型允许您使用以下类型作为输入参数:

  • 基本类型(整数、布尔值)

  • 您自己的结构

  • any 用于自由形式的对象

注意: Atlas Go SDK 仅在模型需要处理多个冲突值时才使用自由格式对象。示例,某些现有的MongoDB Search API 允许您提供布尔值或对象。

Atlas Go SDK 利用 SDK 指针来表示 Go 编程语言中的可选值:

// Surrounding code omitted for brevity
type Data struct {
// Represents an optional name
Name *string `json:"results,omitempty"`
}

在上面的示例中,字符串值是可选的,如果您未显式设置它,则不会将其发送到服务器。

Atlas Go SDK 将所有数组表示为指针:

// Surrounding code omitted for brevity
type Data struct {
Results *[]DataRole `json:"results,omitempty"`
}

以下场景将指针与数组结合使用:

  • 更新包含空数组的请求(重置字段值):

如果您将结构体属性显式设置为空数组,则 SDK 将向 Atlas API 发送空数组请求。

// Surrounding code omitted for brevity
data := Data{
// Sending an empty array
Results: &[]DataRole{}
}
  • 更新请求而不更新数组字段:

执行更新操作时,建议不要设置结构体属性。

// Surrounding code omitted for brevity
data := Data{
// Sending an empty array by not setting field values (value is nil)
// Results: &[]DataRole{}
}

当您在 Golang 中使用指针时,这些实践可确保准确处理 SDK 中的可选值和数组更新。

在 Atlas Go SDK 中, io.ReadCloser类型用于使用 API 返回二进制数据。

  • 使用io.Copy存储在文件上或通过另一个流传递。

  • 使用io.ReadAll读取内存中的所有字节。

  • 读取数据后调用.Close()函数

注意:请参阅examples/下载/downloadLogs.go中的示例

使用专用方法创建新模型。

例如,不使用以下内容:

// Surrounding code omitted for brevity
GroupInvitationUpdateRequest{
...
}

使用以下专用方法:

// Surrounding code omitted for brevity
admin.NewGroupInvitationUpdateRequest(...)

使用 golangci-lint 检测使用Atlas Go SDK 时的常见错误。Atlas Go SDK 不提供自己的 linter。

我们不建议使用bodyclose规则,因为它会报告 Atlas GO SDK 和其他库的许多误报。

要学习;了解更多信息,请参阅bodyclose。