Go语言是一种为现代扩展和分布式系统构建的表达式语言。它是一种流行的服务器端语言,用于构建Web应用程序和微服务,特别是那些需要高性能和并发处理的应用程序。由于其简单易上手,Go语言迅速成为构建大型系统的一个可靠且灵活的选项。
MongoDB以其开发数据平台而闻名,不仅仅是一个数据库。MongoDB是一个全托管的多云平台,它允许您更快地构建和扩展应用程序,执行高级数据分析,可视化数据等等。
目录
Go语言,或称Go编程语言,是由Google开发并于2009年公开宣布的。现在它是一个开源项目,有来自开源社区的许多贡献者。
Go语言的编译性能和轻量级、用户友好的语法结合,使其成为构建与MongoDB数据驱动应用程序的完美选择。MongoDB通过官方Go驱动程序支持Go编程语言。
如果您想创建一个高性能的本地应用程序,但又不想使用C或C++,那么Go语言和MongoDB是您的选择。
以下是一个简单的Go语言代码示例,用于添加两个数字:
package main
import "fmt"
func main() {
num1 := 1
num2 := 2
sum := num1 + num2
fmt.Println("The sum is:", sum)
}
在上面的例子中,我们导入了fmt(格式)实用程序包,并使用它执行打印操作。main()是Go程序的主函数,即应用程序启动时首先运行的函数。从我们看到的来看,语法非常易于阅读和理解。Go使用Go模块管理项目依赖。
Go语言是一种编译型语言,其中编译器将源代码转换为机器码(可执行二进制文件),可以在编译过程中使用的任何目标平台上运行。Go不需要解释器。Go运行时负责内存管理(垃圾回收)并提供并发机制(goroutines和channels)。
使Go语言独特的特性包括
Go使用静态类型——变量的类型必须已知,并且在编译时由编译器强制执行。这确保了代码的安全性,并在编译过程中捕捉到代码中的任何类型错误。Go还提供了“:=”运算符,因此即使没有显式定义变量类型,编译器也可以根据变量的赋值推断变量的类型。
Go引入了称为goroutines的线程,可以并发执行多个任务。这些goroutines可以通过Go提供的通道和其他同步原语进行通信和同步,以确保任务顺利完成。
Go使用三色标记和清除垃圾回收器进行高效和自动的内存管理。这也有助于防止应用程序中的许多内存泄漏。
结构体(或结构)是将对象绑定在一起的一种简单方法。它们类似于Java中的类和C++中的结构。使用结构体,您可以一起将一个项目的相似功能分组在一起。例如,客户可以具有姓名、电子邮件、年龄、地址、电话号码等字段。这些对所有客户都是通用的,因此可以一起使用和存储。MongoDB遵循相同的设计原则——一起使用的数据存储在一起。下面是一个简单的Go结构体示例
package main
import "fmt"
type Customer struct {
Name string
Email string
Address string
Age int
Phone string
}
这种结构使得数据模型映射、存储和检索变得容易。结构体也是Go天然适合MongoDB的原因,因为它们与BSON兼容。Go结构体可以直接转换为BSON文档,并允许开发人员指定字段应该如何进行编码和解码。
type Customer struct {
Name string `bson:"name"`
Email string `bson:"email"`
Address string `bson:"address"`
Age int `bson:"age"`
Phone string `bson:"phone"`
}
Go旨在简单、轻量级,但功能强大。它的丰富语言感觉像动态类型的解释型语言,可以快速编译为静态机器码。代码可以在不同的操作系统或硬件配置上本地运行。
Go易于编写,其多核并发有助于充分利用硬件。它表达性强、灵活且模块化。因为它被静态编译为机器码,所以它的运行时性能得到提高。它非常快速、可互操作且方便。
十多年来,MongoDB在多个列表中一直占据着最受欢迎的NoSQL数据库技术的榜首。您可以在自己的计算机上安装MongoDB,或通过MongoDB Atlas在任何地方使用它。它是一个用于构建高度可用和可扩展互联网应用程序的开发者数据平台。MongoDB成立于2007年,在开发者社区中拥有全球影响力。MongoDB始终专注于为开发者提供卓越的用户体验,这使得MongoDB成为全球开发者的首选。
如果您正在构建新项目并需要数据库,从一开始就考虑使用MongoDB Atlas。Atlas会为您提供一款全面管理的云原生数据库服务,并附带众多功能,包括全文搜索、图表、合作伙伴集成等。MongoDB的灵活性使其非常适合与Go一起构建服务器和数据处理管道。
MongoDB服务器以BSON类型存储文档,而Golang可以直接将字段映射到BSON类型,这使得在Go结构体和MongoDB文档之间移动变得非常容易。
Go结构体还支持使用诸如“omitempty”(省略零值字段)、“inline”(使嵌入的结构体与父结构体处于同一级别)、“string”(即使字段类型不同也将其编码为字符串)等标签进行更高级的配置。这允许开发者自定义和微调MongoDB中的BSON/JSON文档的编码-解码。
MongoDB提供了官方Go驱动程序的简单集成。MongoDB Go驱动程序提供了一种符合Go语法的交互方式,支持所有CRUD操作和其他高级功能。
MongoDB Go驱动程序包提供了一套工具,用于与MongoDB数据库交互并执行一系列活动,从基本的CRUD操作到高级聚合,包括插入、更新和删除多个文档。Go驱动程序包还支持管理索引、事务、GridFS、变更流和连接池。
MongoDB Go驱动程序需要指定连接到您的MongoDB集群的位置和方式。这些指令存储在连接字符串中,包括有关集群的主机名或IP地址和端口的详细信息、适用的身份验证机制、凭证和其他连接选项。
要获取您的集群和用户的连接字符串,请登录您的Atlas账户,导航到“数据库”部分,然后单击您想要连接的MongoDB集群的“连接”按钮。
继续到“连接您的应用程序”步骤,选择“Go”作为MongoDB驱动程序和驱动程序版本,然后复制字符串。
Atlas UI显示您可以复制到应用程序代码中的连接字符串,并修改应用程序的用户名和密码。Atlas UI还提供了查看完整代码示例的选项,展示MongoDB客户端实例如何使用该字符串创建到MongoDB数据库的数据库连接实例。
如果您使用其他工具,例如MongoDB Compass或MongoDB Shell,您可以从Atlas UI中选择相应的选项,并在您的项目中使用提供的连接字符串连接到MongoDB客户端。如果您想跟随示例,请查看示例应用程序代码。
与SQL数据库不同,MongoDB服务器以文档和集合的形式存储信息。
MongoDB数据库将数据记录存储为BSON 文档。BSON是JSON文档的二进制表示,尽管它支持比JSON更多的数据类型。MongoDB文档由字段值对组成,其结构如下
{
field1: value1,
field2: value2,
field3: value3,
...
fieldN: valueN
}
与字段相关联的值可以是任何BSON数据类型,包括其他文档、数组,甚至文档数组。字段名称本身是字符串。
以下代码展示了数据在MongoDB中的存储方式
{
"name": "Micheal Joe",
"email": "[email protected]",
"address": "1501, 9th Main, New Jersey, USA",
"age": 43,
"phone": "+1233377800"
}
与关系型数据库的标准行相比,文档具有更高的灵活性,因为它们提供的是动态模式而不是强制模式(尽管您可以通过MongoDB进行模式验证,如果您想的话!)。
MongoDB在集合中存储文档。数据库集合实例类似于关系型数据库中的表。有关如何创建集合实例以及其他有关集合的信息,您可以查看文档。在尝试插入文档时,如果MongoDB找不到指定的集合,它会创建该集合然后再插入文档。
安装Go和MongoDB驱动后,您可以从应用程序代码中查询MongoDB集群。
MongoDB数据库允许您创建、读取和匹配、更新和删除文档。这些操作被称为CRUD(创建、读取、更新和删除)操作,是您可能想对数据库进行的四个基本操作。MongoDB还提供了从应用程序代码中执行高级查询的选项,使用其聚合框架。
您可以使用MongoDB查询API来完成所有这些操作。查询API简化了在应用程序代码中处理数据,并且对于简单和高级操作都很容易使用。
要插入单个文档,您可以使用InsertOne()方法。请参阅我们关于创建并将文档插入到集合中的示例。
如果您想插入多个文档,可以使用InsertMany()。
要使用InsertOne()方法找到插入的文档,您可以使用FindOne()方法。它将返回单个文档。要一次找到所有文档,您可以使用Find()方法。
您可以使用删除操作从MongoDB集合中删除文档。您可能已经听说过deleteOne方法。与上面插入文档的方法类似,您可以使用deleteOne()方法删除单个文档,或使用deleteMany()方法删除多个文档。deleteOne方法和deleteMany方法都返回一个DeleteResult类型,其中包含已删除文档数量的信息。
要更改MongoDB中的文档,您可以使用更新或替换操作。更新操作会更改您指定的字段,同时保留所有其他字段和值不变。替换操作会删除所有现有字段(除_id外),并用您指定的新字段和值替换删除的字段。
官方驱动程序提供了几种更改文档的方法:updateOne()用于单个文档,updateMany()用于多个文档,ReplaceOne(),BulkWrite(),FindOneAndReplace()等等。更多关于更新和替换文档的信息,请查看更多信息。
您可以通过创建一个聚合操作符的管道并将它们传递给Aggregate(pipeline)方法来创建任何类型的查询,以获取所需的精确文档。您可以使用MongoDB聚合管道执行过滤、排序、分组等操作。
通过MongoDB数据库方法与数据交互有许多方式。一种方式是将文档字段映射到本地Go数据结构。能够以您在数据库中找到的数据的方式直接处理数据是一种巨大的好处!
Go编程语言的struct定义了MongoDB文档的模式。Go驱动程序处理BSON和Go类型之间的转换。第一步是定义Go struct,并使用BSON标签指定struct字段与MongoDB集合实例字段之间的映射。让我们回到之前Go structs的“Customer”示例,看看我们如何将其映射到MongoDB的“customers”集合以确保类型安全。我们还在下面的代码中添加了时间和地址字段
// Address struct
type Address struct {
Street string `bson:"street"`
City string `bson:"city"`
State string `bson:"state"`
Zip string `bson:"zip"`
}
// Customer struct
type Customer struct {
ID string `bson:"_id",omitempty`
Name string `bson:"name"`
Email string `bson:"email"`
Age int `bson:"age"`
Phone string `bson:"phone"`
Address Address `bson:",inline"`
Joining_date time.Time `bson:"joining_date,omitempty"`
}
ID字段是可选的。然而,如果没有从应用程序中指定值,MongoDB将自动处理。
MongoDB数据库中的相应文档将是
{
"_id": "603f2e4g8f1e6y7x8c0f9o1f",
"name": "Micheal Joe",
"email": "[email protected]",
"age": 43,
"phone": "+1233377800",
"street": "1501, 9th Main",
"city": "NY",
"state": "NY",
"zip": "12345",
"joining_date": "2023-06-18T12:00:00Z"
}
请注意,地址struct被标记为“inline”,这意味着嵌入的结构存储在与客户结构相同的行中,而不是作为嵌入的文档。如果地址没有被标记为inline,文档将看起来像
{
"_id": "603f2e4g8f1e6y7x8c0f9o1f",
"name": "Micheal Joe",
"email": "[email protected]",
"age": 43,
"phone": "+1233377800",
"address": {
"street": "1501, 9th Main",
"city": "NY",
"state": "NY",
"zip": "12345",
},
"joining_date": "2023-06-18T12:00:00Z"
}
MongoDB的许多优点之一是其安全特性。除了网络和基于用户的规则之外,您还可以加密静态数据、传输中的数据和现在,使用客户端字段级加密(CSFLE)。通过字段级加密,您可以选择在客户端加密文档中的某些字段,同时保留其他字段为纯文本。这特别有用,因为在使用CLI、Compass或直接在Atlas中查看CSFLE文档时,加密字段将无法被人类阅读。当它们无法被阅读时,如果文档落入错误的手中,那些字段对恶意用户将毫无用处。然而,当使用MongoDB语言驱动程序并使用相同的加密密钥时,那些字段可以在应用程序内被解密并可查询。
在开发者中心可以找到关于MongoDB中使用Go驱动程序的CSFLE的教程。
官方的MongoDB Go驱动程序允许您将MongoDB集成到任何应用程序中,并利用Go生态系统。
对于服务器开发,有如Revel和Gin这样的全功能Web框架,以及Web.go等更轻量级的工具。甚至还有像Gorilla web toolkit这样的更简单的模块化方法。这些框架提供了用于云和服务器端应用程序的直接工具,Go的并发特性证明了它是高性能服务器应用程序的理想选择。您还可以仅使用标准库进行非常高级的实现。MongoDB数据库提供横向扩展性,这使得构建和维护服务器应用程序以及处理大量数据变得更容易。
对于数据科学用例,您可以使用Gopher Data、Gopher Notes、Gota或qframe等工具。对于机器学习用例,GoLearn是一个可能的选择。
Go的高性能特性非常适合数据密集型任务和大规模数据处理。由于MongoDB数据库具有灵活的动态模式,它可以轻松存储非结构化和半结构化数据。MongoDB还提供了聚合框架,它可以轻松地通过丰富的查询能力处理复杂场景。此外,MongoDB还提供了诸如向量搜索等特性,并支持与大型语言模型(LLM)和检索增强生成(RAG)工具的完全集成。
Go可以轻松编译到各种操作系统,并生成小型的独立(自包含)二进制文件。MongoDB数据库是存储和检索大量日志、配置数据和其他工具所需数据的完美后端。
物联网、机器人和游戏系统需要高速数据处理以及多任务支持。这两种功能都通过Go的并发和高度性能特性得到支持。MongoDB的灵活模式使其非常适合处理不断变化的数据结构和大量实时数据,如时序数据。
Go语言由于其小巧且自包含的二进制文件大小,提供了快速的部署和启动时间,因此成为了微服务的理想选择。Go的生态系统包括相关的工具,如用于更快速和更安全通信的Protobuffers、记录器、身份提供者客户端和其他中间件,以简化开发。此外,MongoDB数据库提供了灵活的模式,每个微服务可以管理自己的数据模型,并在集合实例中轻松存储复杂的数据结构。
内容管理系统需要高速并发请求处理,这是Go语言的主要卖点之一。MongoDB通过提供全文搜索、内容文档版本控制、灵活的数据格式等功能来补充这一优势。
Go的高性能和并发支持以及MongoDB丰富的聚合框架、实时数据处理和索引功能,在数据摄取、处理、分析和转换方面非常有用。
MongoDB大学是一个寻找关于MongoDB所有信息的绝佳地方。这里有官方的认证项目以及更非正式的开发者路径,以指导您的学习之旅。
MongoDB开发者中心包含了有关MongoDB Go驱动程序的大量信息,包括教程、视频和快速入门指南,以及示例代码。
使用MongoDB的最好之处在于充满活力的Go社区,该社区包括具有各种经验水平的Go驱动程序用户。对于一般问题的支持,最佳方式是使用MongoDB社区论坛或StackOverflow。
如果您遇到意外的错误,认为您已发现驱动程序的错误,或您有功能请求,请在GODRIVER项目中创建一个JIRA工单。您可以在文档中找到如何操作的操作说明。驱动程序和核心服务器都公开了错误报告。
是的!我们很高兴接受有助于改进驱动程序的贡献。我们将指导用户贡献,以确保它们符合代码库的标准。请确保任何拉取请求都包含文档和测试,并通过所需的检查。
要开始,请查看源代码并在分支上工作。有关提交拉取请求的更多信息,请参阅更多信息。
您可以在MongoDB开发者中心找到使用MongoDB Go驱动程序的其他示例。开发者中心提供教程、视频和代码示例,以帮助您使用MongoDB进行构建。