MongoDB の 安装与基本使用
安装 mongo
建议使用 docker
直接一键安装
docker run --name mongo_zdp -p 27017:27017 -d mongo:latest
GUI
工具,我使用过的有两个,一个是 navicate
,一个是 nosqlbooster
。下载地址如下
https://nosqlbooster.com/downloads
mysql 和 mogodb 名称的对比
mysql | MongoDB |
---|---|
数据库 | 数据库 |
表 | 集合 |
列 | 字段 |
joins | 嵌入文档或者链接 |
CRUD
创建数据库;直接切换数据库,如果没有对应的数据库,就会创建新的。
use school;
db.dropDatabase(); # 删除数据库
集合操作
db.createCollection("students", {}); # 创建集合
db.student.drop(); # 删除集合
往集合插入数据
db.students.insert({"name":"张山","age":18});
从集合中查找数据
db.student.find();
db.students.find().pretty(); # 使用格式化的方式,显示查询结果
查询数据
查询名字叫张山的
db.students.find({"name":"张山"}).pretty();
# 年龄叫张山,并且年龄为 18 岁的人。
db.students.find({"name":"张山","age":18}).pretty();
# 名字叫张山或者李四的人
db.students.find({$or:[{"name":"张山"},{"name":"李四"}]}).pretty();
# 年龄大于20岁,名字叫做张山或者李四的人
db.students.find({"age":{$gt: 20},$or:[{"name": "张山"}, {"name": "李四"}]}).pretty();
翻页和跳过
# 仅返回一条数据
db.students.find({"name":"张山"}).limit(1).pretty();
# 跳过一条数据后再进行查询
db.students.find({"name":"张山"}).limit(1).skip(1).pretty();
# 按照年龄正序排列
db.students.find({"name":"张山"}).sort({"age":1});
# 按照年龄逆序排列
db.students.find({"name":"张山"}).sort({"age":-1});
聚合函数
# 求平均年龄
db.students.aggregate([{$group:{_id:null,avgAge:{$avg:"$age"}}}]);
# 按照名字聚合以后,求平均年龄
db.students.aggregate([{$group:{_id:"$name",avgAge:{$avg:"$age"}}}]);
go语言操作mongdb
package main
import (
"context"
"log"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
// 定义结构体
type Student struct {
Name string
Age int
}
func NewMongoCli(ctx context.Context) *mongo.Client {
clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
client, err := mongo.Connect(ctx, clientOptions)
if err != nil {
log.Fatalln("初始化错误", err)
}
if err = client.Ping(ctx, nil); err != nil {
log.Fatalln("连接错误", err)
}
log.Println("connected success")
return client
}
func main() {
// 创建连接
ctx := context.Background()
client := NewMongoCli(ctx)
defer func() {
client.Disconnect(ctx)
log.Println("mongodb 连接断开")
}()
// 连接数据库
collection := client.Database("school").Collection("students")
// 插入数据
collection.InsertOne(ctx, Student{
Name: "郭靖",
Age: 24,
})
log.Println("数据插入成功")
// 读取结果到结构体中
var s1 Student
if err := collection.FindOne(ctx, bson.D{{Key: "name", Value: "张山"}}).Decode(&s1); err != nil {
if err == mongo.ErrNoDocuments {
log.Println("没有找到对应的数据集")
}
log.Fatalf("数据结果读取失败%s", err)
}
log.Println("数据读取成功", s1)
}