MongoDB
MongoDB是一种高性能、开源、文档型的NoSQL数据库,被广泛应用于Web应用、大数据以及云计算领域。MongoDB属于非关系型数据库,它是由C++编写的分布式文档数据库。内部使用类似于Json的bson二进制格式。
中文手册
https://www.w3cschool.cn/mongodb/
驱动
驱动 https://www.mongodb.com/docs/drivers/
Go驱动 https://www.mongodb.com/docs/drivers/go/current/
驱动安装
1 | go get go.mongodb.org/mongo-driver/mongo |
连接字符串
https://www.mongodb.com/docs/manual/reference/connection-string/#examples
1 | mongodb://[username:password@]host1[:port1][,...hostN[:portN]] [/[defaultauthdb][?options]] |
连接例子 https://www.mongodb.com/docs/drivers/go/current/fundamentals/connection/#connection-example
快速入门 https://www.mongodb.com/docs/drivers/go/current/quick-start/
1 | package main |
基本概念
MongoDB中可以创建使用多个库,但有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
- admin: 从权限的角度来看,这是”root”数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
- local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合。
- config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
RDBMS | MongoDB |
---|---|
Database | Database |
Table | Collection |
Row | Document |
Column | Field |
Join | Embedded Document嵌入文档或Reference引用 |
Primary Key | 主键(MongoDB提供了key为_id) |
Go Driver使用,官方博客 https://www.mongodb.com/blog/post/mongodb-go-driver-tutorial
数据封装
1 | type User struct { |
Tag参考 https://www.mongodb.com/docs/drivers/go/upcoming/fundamentals/bson/#struct-tags
User结构体中ID一定要使用omitempty,新增时结构体ID不设置则为零值,提交时不会提交ID,数据库自动生成_id
ObjectId有12字节组成,参考 bson/primitive/objectid.go/NewObjectID()函数
- 4字节时间戳
- 5字节进程唯一值
- 3字节随机数,每次加1
插入数据
操作参考 https://www.mongodb.com/docs/drivers/go/current/usage-examples/
1 | // 插入一条数据 |
BSON
https://www.mongodb.com/docs/drivers/go/upcoming/fundamentals/bson/
MOngoDB的Go库提供的构建BSON的数据类型分为4种
- D : An ordered representation of a BSON document (slice),表示有序的,切片且元素是二元的
- M : An unordered representation of a BSON document (map),表示无序的,map且元素是kv对
- A : An ordered representation of a BSON array
- E : A single element inside a D type
具体使用看以下的例子
查询
单条查询
1 | // 查询一条数据 |
多条查询
1 | // 查询多条数据 |
条件查询
改造上面的findMany2函数,可以使用下面表格中不同filter
https://www.mongodb.com/docs/manual/reference/operator/query/and/
比较符号 | 含义 | filter示例 |
---|---|---|
$lt | 小于 | bson.M{"age": bson.M{"$lt": 20}} |
$gt | 大于 | bson.M{"age": bson.M{"$gt": 20}} |
$lte | 小于等于 | bson.M{"age": bson.M{"$lte": 20}} |
$gte | 大于等于 | bson.M{"age": bson.M{"$gte": 20}} |
$ne | 不等于 | bson.M{"age": bson.M{"$ne": 20}} |
$eq | 等于,可以不用这个符号 | bson.M{"age": bson.M{"$eq": 20}} bson.M{"age": 20} |
$in | 在范围内 | bson.M{"age": bson.M{"$in": []int{16, 33}}} |
$nin | 不在范围内 | bson.M{"age": bson.M{"$nin": []int{16, 33}}} |
逻辑符号 | 含义 | filter 示例 |
$and | 与 | bson.M{"$and": []bson.M{{"name": "tom"}, {"age": 33}}} bson.M{"$and": []bson.M{{"name": "tom"}, {"age": bson.M{"$gt":40}}}} |
$or | 或 | bson.M{"$or": []bson.M{{"name": "tom"}, {"age": bson.M{"$lt":20}}}} |
$not | 非 | bson.M{"age": bson.M{"$not": bson.M{"$gte": 20}}} |
元素 | 含义 | 示例 |
---|---|---|
$exists | 文档中是否有这个字段 | bson.M{"Name": bson.M{"$exists": true}} |
$type | 字段是否是指定的类型 | bson.M{"age": bson.M{"$type": 16}} |
常用类型,参考 https://docs.mongodb.com/manual/reference/operator/query/type/#op._S_type
- 字符串类型编码为2,别名为string
- 整型编码为16,别名为int
- 长整型编码为18,别名为long
改造函数findByFilter
为findAll
,如下
1 | func findAll(filter interface{}, opt *options.FindOptions) { |
投影
1 | filter := bson.M{"age": bson.M{"$gt": 20}} |
排序
1 | opt.SetSort(bson.M{"age": 1}) // 升序 |
分页
1 | opt.SetSkip(1) // offset |
更新
更新操作符 | 含义 | 示例 |
---|---|---|
$inc | 对给定字段数字值增减 | bson.M{"$inc": bson.M{"age": -5}} |
$set | 设置字段值,如果字段不存在则创建 | bson.M{"$set": bson.M{"gender": "M"}} |
$unset | 移除字段 | {'$unset':{'Name':""}} |
1 | // 更新一条 |
删除
1 | // 删除一条 |