数据库
数据库也是一个常用的功能,通过数据库,我们可以存储一些有结构的数据,比如友链数据,用户赞助数据等等。
记得在auth里面加上
database
# 简介
博客系统的数据库采用的是MongoDB数据库。所以在你操作之前建议去看一下MongoDB的教程,比如这篇MongoDB 教程 | 菜鸟教程 (runoob.com) (opens new window) 因为MongoDB有些操作和MySQL不一样,所以有些地方如果你没接触过MongoDB的话可能会很懵逼。
这里我简单介绍一下最基本的概念,MongoDB里面的对象对MySQL的数据库,集合对应MySQL的表。MongoDB与MySQL的最大区别就是MySQL的数据是表结构的,格式要求严格,而MongoDB存的是JSON格式,所以每行数据的结构都可以不一样。这种方式最大的好处就是存储数据非常的灵活,你可以存储任意结构的数据,而不用关心字段。
# 初始化集合
在使用数据库之前,我们需要初始化一个连接对象,建议集合名字作为常量放在最开始那一行,然后下面的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"})
})
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)
}
})
})
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
上面这段代码其实很好理解,我们调用InsertOne
插入了一条数据,然后会通过回调的形式来通知你,这里我们需要判断一下err
字段,如果执行没有错误的话,err
就为空,我们返回操作成功的结果,如果执行有错误的话,那么我们就返回err
内容,我们调用一下路由就会发现数据插入成功,返回了插入后的ID
然后我们查看一下数据库,可以发现,我们的值成功插入进去了
上面这个看起来很像MySQL的表,但是实际上,我们切换一下显示模式就可以看到原始的数据了
# 插入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)
}
})
2
3
4
5
6
7
8
9
10
11
下面这个是返回的结果
下面我们再看一下数据库,可以发现多了一个user_id的字段,并且自动设置为
我们重复调用这个路由后,就可以发现,这个ID已经可以自动递增了,这样就可以实现一些需要自增ID的操作了
不过其实还是建议使用MongoDB的文档ID,默认的性能会快一些
# 删除数据
下面我们来删除一下数据,删除数据分为删除一条数据和删除多条数据
# 删除一条数据
原始数据如下:
代码如下
// 初始化集合
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)
}
})
2
3
4
5
6
7
8
9
10
11
DeleteOne
这个函数有两个参数,第一个是过滤的条件,第二个是回调函数,回调函数就不多少了,过滤条件传入一个对象,在对象里面指定一下字段的字段的值
我们执行后可以看一下
我们看一下数据库,因为我执行了两次,所以这里删除两个数据,只删除一条数据的好处就是可以确保只删除一条数据,避免误删的情况。
# 删除多条数据
这个其实和删除一条数据参数是一样的,只不过这个是删除所有匹配的数据而已,这里我就不给大家演示了
// 初始化集合
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)
}
})
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)
}
})
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)。
我这个$set
的意思就是设置值
下面我们调用一下
数据更新后结果如下
# 更新多条数据
使用UpdateMany函数,这里就不解释了
db.UpdateMany({
filter: {name:"小游1"},
update: {"$set":{name:"小游666"}}
},function (err,res){})
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)
}
})
2
3
4
5
6
7
8
9
10
11
12
13
效果如下
# 查找多条数据
首先第一个重要的就是模糊查询
// 初始化集合
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)
}
})
2
3
4
5
6
7
8
9
10
11
12
13
这个可以返回所有的带有小游的记录,这个说是模糊查询,其实就是正则表达式,如果要完全匹配,那么就直接放入值就行,如果想正则查询可以加上database.regex("")
函数
因为是正则表达式,我们可以进行下面这样的操作,比如我们查询用户名是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)
}
})
2
3
4
5
6
7
8
9
10
11
12
13
# 结果排序
比如我们对所有的结果安装用户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)
}
})
2
3
4
5
6
7
8
9
10
11
12
13
这里我们需要用到sort字段,1就是正序,-1倒序
# 跳过结果
我们可以使用 skip
来跳过结果
// 插入数据
db.FindMany({
skip: 2
},function (err,res){
// 数据插入后的回调操作,可以通过err字段判断数据是否插入成功
if (!err){
router.response.ResponseOk(context,res)
} else {
router.response.ResponseServerError(context,err)
}
})
2
3
4
5
6
7
8
9
10
11
比如我这个跳过了两条结果
# 设置投影
这个其实用的不多,等我后续有时间再完善一下
# 获取记录条数
我们获取一下name
为小游
的总共有多少条记录
// 初始化集合
let db = database.newDb(dbTest)
// 插入数据
router.response.ResponseOk(context,db.GetCount({name: "小游"}))
2
3
4
这个GetCount
只有一个参数就是过滤条件