云开发 数据库 CRUD
上一节演示了云函数的基本 DEMO,但是比较简单,就直接返回了一个“好好学习” 的 JSON 对象。这一小节来熟悉数据库。
云开发提供了一个 NoSQL 数据库,数据库中的每条记录都是一个 JSON 格式的对象。一个数据库可以有多个集合(相当于关系型数据中的表),集合可看做一个 JSON 数组,数组中的每个对象就是一条记录。
一般我们称数据记录的增加(Create)、读取(Retrieve)、更新(Update)和删除(Delete) 统称为 CRUD。下面,我们基于云函数对数据库进行操作。
创建数据库集合(表)和创建一个云函数
第1步:创建一个数据集合,取名为 users
第2步:创建 4 个云函数,分别取名为:
- insert_db
- query_db
- update_db
- delete_db
如下图:
如果还不了解如何创建云函数,可以查看上一篇「编写第一个云函数」
插入数据
点击云函数列表中的 “insert_db” 函数,进入代码编辑页面。在编写代码之前,我们需要安装一个 Node.js 模块 tcb-admin-node
, 该模块提供了在云函数或者说在Node.js 服务端器环境下,可以操作数据库、云存储等的一些方法/API。
创建 package.json 文件
因为需要引入 tcb-admin-node
模块,所以先要创建 package.json 文件,可以按照如下图片1,2,3,4进行。最后记得点击【保存并安装依赖】。
package.json 文件内容如下,可以复制进去。
{
"dependencies": {
"tcb-admin-node": "*"
}
}
编写代码
第 1 步: 获取该环境 ID
在控制台左侧边栏点击【环境】,点击【环境纵览】,复制环境 ID。后面代码需要通过环境 ID,访问环境的资源,例如数据库。
第 2 步: 编写代码
往 index.js 文件中编写如下代码,并点击【保存并安装依赖】,代码如下:
'use strict';
const tcb = require('tcb-admin-node')
const app = tcb.init({
env: '你的环境 ID'
})
const db = app.database()
exports.main = async (event, context) => {
let result = await db.collection('users').add({
name: 'test',
age: 25,
create_time: new Date()
})
return result
}
下面分析代码:
const tcb = require('tcb-admin-node')
引入云开发 Node.js SDK;const app = tcb.init({})
初始化环境;app.database()
获取数据的引用;db.collection('users')
其中 users 是 6.1 节中创建的数据库集合,或者说“表”,这里获取集合的引用;add({})
方法,输入参数为 JSON 对象,这里是一个 user 记录;-
async
和await
JavaSript API,可以将异步转成同步操作;
第 3 步:开启 HTTP 触发和路径配置
整个配置过程可以参见上一篇 「编写第一个云函数」 。配置一个触发路径,如下图:
第 4 步:访问 HTTP 并验证数据是否插入
点击链接,浏览器打开访问一次,就插入一次数据。我们点击左侧边栏【数据库】,再点击数据库【users】,即可看到如下数据:
多请求几次数据库就会出现多几条数据。
查询数据
这里,我们使用一开始创建的 query_db
云函数。当然你可以继续使用 insert_db
函数。如果不是使用上面的函数,这里我们同样需要做以下几件事:
- 创建 package.json 并且填写 package.json 内容,见 6.2.1 节;
- 使用【保存并安装依赖】按钮;
- 需要复制环境 ID;
- 需要配置云函数 HTTP 触发路径, 例如
/query_db
;
查询的代码具体如下所示:
'use strict';
const tcb = require('tcb-admin-node')
//初始化环境
const app = tcb.init({
env: '你的环境 ID'
})
//获取数据引用
const db = app.database()
exports.main = async (event, context) => {
//使用 where 方法查询 name 为 test 数据
//链式调用 get 方法,执行查询过程并返回数据
let result = await db.collection('users').where({
name: 'test'
})
.get()
//获取返回的数据结果
return result.data
}
访问配置的 HTTP 触发路径,即可查询之前插入的数据,上面的插入请求了 3 次,所以数据返回的 3 条。
[
{
"_id": "5e847ab25ebfe17b0112ef031602897d",
"age": 25,
"create_time": "2020-05-16T12:50:03.492Z",
"name": "test"
},
{
"_id": "e2297d935ebfe86b00bcb9cb6e7c7f1a",
"age": 25,
"create_time": "2020-05-16T13:19:39.931Z",
"name": "test"
},
{
"_id": "a9bfcffc5ebfe88700b26c896baeac9f",
"age": 25,
"create_time": "2020-05-16T13:20:07.279Z",
"name": "test"
}
]
如果需要返回两条数据,可以使用 limit(2) ,返回 N 条,就 limit(N) 例如:
let result = await db.collection('users').where({ name: 'test'})
.limt(2)
.get()
更新数据
同样,如果是使用新创建的云函数,需要做以下几件事:
- 创建 package.json 并且填写 package.json 内容,见 6.2.1 节;
- 使用【保存并安装依赖】按钮;
- 需要复制环境 ID;
- 需要配置云函数 HTTP 触发路径, 例如
/update_db
;
这里我想更新所有符合要求的记录的 age 值,全部更新为 88 岁,代码如下:
'use strict';
const tcb = require('tcb-admin-node')
//初始化环境
const app = tcb.init({
env: '你的环境 ID'
})
//获取数据引用
const db = app.database()
exports.main = async (event, context) => {
//使用 where 方法查询 name 为 test 数据
//将符合要求的数据的 age 字段值更新为 88
let result = await db.collection('users').where({
name: 'test'
}).update({
age: 88
})
return result
}
同样请求 HTTP 服务,完成更新操作,浏览器返回数据如下,说明符合要求的 3 条数据均已更新。
{
"requestId": "1589636820392_1_01781",
"updated": 3
}
update
方法是局部更新,用于更新字段;如果替换某条记录,可以使用 set
方法,具体见 数据库替换更新
删除数据
同样,如果是使用新创建的云函数,需要做以下几件事:
- 创建 package.json 并且填写 package.json 内容,见 6.2.1 节;
- 使用【保存并安装依赖】按钮;
- 需要复制环境 ID;
- 需要配置云函数 HTTP 触发路径, 例如
/delete_db
;
'use strict';
const tcb = require('tcb-admin-node')
//初始化环境
const app = tcb.init({
env: 'serverless-1d83e7'
})
//获取数据引用
const db = app.database()
exports.main = async (event, context) => {
//使用 where 方法查询 name 为 test 数据
//remove 删除符合条件的所有数据
let result = await db.collection('users').where({
name: 'test'
}).remove()
return result
}
通过 HTTP 触发云函数,浏览器返回 3 条数据被删除:
{
"requestId": "1589637228874_1_51061",
"deleted": 3
}
通过 where 方法可以删除符合条件的所有数据,如果只想删除指定 _id 字段的 1 条数据,可以参见 删除一条记录
附录
- 更多请参考 数据库参考指南