XBlog开发手册 XBlog开发手册
  • 快速入门
  • API参考
  • 快速入门
  • API参考
GitHub (opens new window)
  • 快速入门
  • API参考
  • 快速入门
  • API参考
GitHub (opens new window)
  • 快速入门

    • 简介
    • 路由
    • 数据库
      • 简介
      • 初始化集合
      • 增加数据
        • 插入ID自增的数据
      • 删除数据
        • 删除一条数据
        • 删除多条数据
      • 更新数据
        • 更新一条数据
        • 更新多条数据
      • 查找数据
        • 查找一条数据
        • 查找多条数据
        • 结果排序
        • 跳过结果
        • 设置投影
      • 获取记录条数
    • 网络
    • 爬虫
    • 定时任务
    • 文件读取
    • 邮件
    • 工具包
    • 界面
  • API参考

  • 插件开发
  • 快速入门
小游
2021-07-27

数据库

数据库也是一个常用的功能,通过数据库,我们可以存储一些有结构的数据,比如友链数据,用户赞助数据等等。

记得在auth里面加上 database

# 简介

博客系统的数据库采用的是MongoDB数据库。所以在你操作之前建议去看一下MongoDB的教程,比如这篇MongoDB 教程 | 菜鸟教程 (runoob.com) (opens new window) 因为MongoDB有些操作和MySQL不一样,所以有些地方如果你没接触过MongoDB的话可能会很懵逼。

这里我简单介绍一下最基本的概念,MongoDB里面的对象对MySQL的数据库,集合对应MySQL的表。MongoDB与MySQL的最大区别就是MySQL的数据是表结构的,格式要求严格,而MongoDB存的是JSON格式,所以每行数据的结构都可以不一样。这种方式最大的好处就是存储数据非常的灵活,你可以存储任意结构的数据,而不用关心字段。

image-20210728083650832

# 初始化集合

在使用数据库之前,我们需要初始化一个连接对象,建议集合名字作为常量放在最开始那一行,然后下面的db就是我们初始化后的对象。我们可以使用对象对数据库进行操作。

// 获取API接口
const router =xBlog.router
const database = xBlog.database
// 数据库集合名
const dbTest = "test"
// 注册路由
router.registerRouter("GET","",function(context){
    // 初始化集合
    let db = database.newDb(dbTest)
    router.response.ResponseOk(context,{message:"ok"})
})

1
2
3
4
5
6
7
8
9
10
11
12

下面我将从增删改查这四个角度来分别说明

# 增加数据

// 获取API接口
const router =xBlog.router
const database = xBlog.database
// 数据库集合名
const dbTest = "test"
// 注册路由
router.registerRouter("GET","",function(context){
    // 初始化集合
    let db = database.newDb(dbTest)
    // 插入数据
    db.InsertOne({name: "小游"},function (err,res){
        // 数据插入后的回调操作,可以通过err字段判断数据是否插入成功
        if (!err){
            router.response.ResponseOk(context,res)
        } else {
            router.response.ResponseServerError(context,err)
        }
    })
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

上面这段代码其实很好理解,我们调用InsertOne插入了一条数据,然后会通过回调的形式来通知你,这里我们需要判断一下err字段,如果执行没有错误的话,err就为空,我们返回操作成功的结果,如果执行有错误的话,那么我们就返回err内容,我们调用一下路由就会发现数据插入成功,返回了插入后的ID

image-20210728084916545

然后我们查看一下数据库,可以发现,我们的值成功插入进去了

image-20210728085036968

上面这个看起来很像MySQL的表,但是实际上,我们切换一下显示模式就可以看到原始的数据了

image-20210728085149591

# 插入ID自增的数据

因为MongoDB的id是文档ID,ID长并且没有规律,而有时候我们又想使用MySQL的自增ID特性怎么办,使用InsertOneIncrease 函数,这个函数只需要指定一下那个key要增加就行。我们数据库操作代码如下:

// 初始化集合
let db = database.newDb(dbTest)
// 插入数据
db.InsertOneIncrease({name: "小游"},"user_id",function (err,res){
    // 数据插入后的回调操作,可以通过err字段判断数据是否插入成功
    if (!err){
        router.response.ResponseOk(context,res)
    } else {
        router.response.ResponseServerError(context,err)
    }
})
1
2
3
4
5
6
7
8
9
10
11

下面这个是返回的结果

image-20210728085622283

下面我们再看一下数据库,可以发现多了一个user_id的字段,并且自动设置为

image-20210728085702997

我们重复调用这个路由后,就可以发现,这个ID已经可以自动递增了,这样就可以实现一些需要自增ID的操作了

image-20210728085758873

不过其实还是建议使用MongoDB的文档ID,默认的性能会快一些

# 删除数据

下面我们来删除一下数据,删除数据分为删除一条数据和删除多条数据

# 删除一条数据

原始数据如下:

image-20210728213539520

代码如下

    // 初始化集合
    let db = database.newDb(dbTest)
    // 插入数据
    db.DeleteOne({name:"小游"},function (err,res){
        // 数据插入后的回调操作,可以通过err字段判断数据是否插入成功
        if (!err){
            router.response.ResponseOk(context,res)
        } else {
            router.response.ResponseServerError(context,err)
        }
    })
1
2
3
4
5
6
7
8
9
10
11

DeleteOne这个函数有两个参数,第一个是过滤的条件,第二个是回调函数,回调函数就不多少了,过滤条件传入一个对象,在对象里面指定一下字段的字段的值

我们执行后可以看一下

image-20210728213808031

我们看一下数据库,因为我执行了两次,所以这里删除两个数据,只删除一条数据的好处就是可以确保只删除一条数据,避免误删的情况。

image-20210728214002143

# 删除多条数据

这个其实和删除一条数据参数是一样的,只不过这个是删除所有匹配的数据而已,这里我就不给大家演示了

    // 初始化集合
    let db = database.newDb(dbTest)
    // 插入数据
    db.DeleteMany({name:"小游"},function (err,res){
        // 数据插入后的回调操作,可以通过err字段判断数据是否插入成功
        if (!err){
            router.response.ResponseOk(context,res)
        } else {
            router.response.ResponseServerError(context,err)
        }
    })
1
2
3
4
5
6
7
8
9
10
11

# 更新数据

更新数据分为更新一条数据和更新多条数据

# 更新一条数据

数据还是上面的数据,下面我们把xiaoyou1更新为xiaoyou666

    // 初始化集合
    let db = database.newDb(dbTest)
    // 插入数据
    db.UpdateOne({
        filter: {name:"小游1"},
        update: {"$set":{name:"小游666"}}
    },function (err,res){
        // 数据插入后的回调操作,可以通过err字段判断数据是否插入成功
        if (!err){
            router.response.ResponseOk(context,res)
        } else {
            router.response.ResponseServerError(context,err)
        }
    })
1
2
3
4
5
6
7
8
9
10
11
12
13
14

这里我简单解释一下,这个函数有两个参数,第一个是option,第二个是回调函数,option里面有filter和update 这两个选项,filter就是过滤参数,和前面delete的相同,这个update字段可以参考官方文档

Field Update Operators — MongoDB Manual (opens new window)。

image-20210728220504017

我这个$set的意思就是设置值

下面我们调用一下

image-20210728215415737

数据更新后结果如下

image-20210728215436613

# 更新多条数据

使用UpdateMany函数,这里就不解释了

db.UpdateMany({
        filter: {name:"小游1"},
        update: {"$set":{name:"小游666"}}
    },function (err,res){})
1
2
3
4

# 查找数据

查找数据也分为查找一条数据和查找多条数据

# 查找一条数据

这个用的次数没有查找多条数据频繁,所以这个先简单给大家贴一下代码,详细的可以看查找多条数据

    // 初始化集合
    let db = database.newDb(dbTest)
    // 插入数据
    db.FindOne({
        filter: {name:"小游666"}
    },function (err,res){
        // 数据插入后的回调操作,可以通过err字段判断数据是否插入成功
        if (!err){
            router.response.ResponseOk(context,res)
        } else {
            router.response.ResponseServerError(context,err)
        }
    })
1
2
3
4
5
6
7
8
9
10
11
12
13

效果如下

image-20210728221322180

# 查找多条数据

首先第一个重要的就是模糊查询

    // 初始化集合
    let db = database.newDb(dbTest)
    // 插入数据
    db.FindMany({
        filter: {name:database.regex("小游")}
    },function (err,res){
        // 数据插入后的回调操作,可以通过err字段判断数据是否插入成功
        if (!err){
            router.response.ResponseOk(context,res)
        } else {
            router.response.ResponseServerError(context,err)
        }
    })
1
2
3
4
5
6
7
8
9
10
11
12
13

这个可以返回所有的带有小游的记录,这个说是模糊查询,其实就是正则表达式,如果要完全匹配,那么就直接放入值就行,如果想正则查询可以加上database.regex("")函数

image-20210728221748242

因为是正则表达式,我们可以进行下面这样的操作,比如我们查询用户名是xiaoyou1或者xiaoyou6 开头的数据,代码如下

    // 初始化集合
    let db = database.newDb(dbTest)
    // 插入数据
    db.FindMany({
        filter: {name:database.regex("小游[2|6]")}
    },function (err,res){
        // 数据插入后的回调操作,可以通过err字段判断数据是否插入成功
        if (!err){
            router.response.ResponseOk(context,res)
        } else {
            router.response.ResponseServerError(context,err)
        }
    })
1
2
3
4
5
6
7
8
9
10
11
12
13

image-20210728223315387

# 结果排序

比如我们对所有的结果安装用户id倒序来进行排序。我们需要使用

    // 初始化集合
    let db = database.newDb(dbTest)
    // 插入数据
    db.FindMany({
        sort: {user_id:-1}
    },function (err,res){
        // 数据插入后的回调操作,可以通过err字段判断数据是否插入成功
        if (!err){
            router.response.ResponseOk(context,res)
        } else {
            router.response.ResponseServerError(context,err)
        }
    })
1
2
3
4
5
6
7
8
9
10
11
12
13

这里我们需要用到sort字段,1就是正序,-1倒序

image-20210728223722755

# 跳过结果

我们可以使用 skip 来跳过结果

// 插入数据
db.FindMany({
    skip: 2
},function (err,res){
    // 数据插入后的回调操作,可以通过err字段判断数据是否插入成功
    if (!err){
        router.response.ResponseOk(context,res)
    } else {
        router.response.ResponseServerError(context,err)
    }
})
1
2
3
4
5
6
7
8
9
10
11

比如我这个跳过了两条结果

image-20210728225936333

# 设置投影

这个其实用的不多,等我后续有时间再完善一下

# 获取记录条数

我们获取一下name为小游的总共有多少条记录

    // 初始化集合
    let db = database.newDb(dbTest)
    // 插入数据
    router.response.ResponseOk(context,db.GetCount({name: "小游"}))
1
2
3
4

这个GetCount只有一个参数就是过滤条件

image-20210729081435402

编辑 (opens new window)
上次更新: 2021/07/29, 09:01:17
路由
网络

← 路由 网络→

Theme by Vdoing | Copyright © 2021-2021 小游
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式