如在中所说,云开发提供了一个 JSON 数据库,本章将介绍以下内容:
- 上手:用控制台创建我的第一个集合,插入我的第一条数据
- 数据类型:了解数据库提供的数据类型
- 权限控制:控制集合与记录的读写权限
- 初始化:初始化数据库 API
- 构建查询条件:构建简单或复杂的查询条件
- 更新数据:数据的局部更新与替换更新
- 索引管理:为字段添加索引实现高效读写
另外可参考小程序端和云函数端的数据库 API 文档
这一节我们将介绍如何在控制台中创建我们的第一个数据库集合、往集合上插入数据、以及在控制台中查看刚刚插入的数据。
打开控制台,选择 "数据库" 标签页,通过 "添加集合" 入口创建一个集合。假设我们要创建一个待办事项小程序,我们创建一个名为 todos 的集合。创建成功后,可以看到 todos 集合管理界面,界面中我们可以添加记录、查找记录、管理索引和管理权限。
控制台提供了可视化添加数据的交互界面,点击 "添加记录" 添加我们的第一条待办事项:
添加完成后可在控制台中查看到刚添加的数据。
云控制台支持上传文件导入已有的数据,可查看导入指引了解如何操作。
接下来,我们一起了解下数据库都提供了哪些数据类型。
云开发数据库提供以下几种数据类型:
下面对几个需要额外说明的字段做下补充说明。
Date 类型用于表示时间,精确到毫秒,在小程序端可用 JavaScript 内置 Date 对象创建。需要特别注意的是,在小程序端创建的时间是客户端时间,不是服务端时间,这意味着在小程序端的时间与服务端时间不一定吻合,如果需要使用服务端时间,应该用 API
中提供的 serverDate 对象来创建一个服务端当前时间的标记,当使用了 serverDate 对象的请求抵达服务端处理时,该字段会被转换成服务端当前的时间,更棒的是,我们在构造 serverDate 对象时还可通过传入一个有 offset 字段的对象来标记一个与当前服务端时间偏移 offset 毫秒的时间,这样我们就可以达到比如如下效果:指定一个字段为服务端时间往后一个小时。
那么当我们需要使用客户端时间时,存放 Date 对象和存放毫秒数是否是一样的效果呢?不是的,我们的数据库有针对日期类型的优化,建议大家使用时都用 Date 或 serverDate 构造时间对象。
GeoPoint 类型用于表示地理位置点,用经纬度唯一标记一个点,这是一个特殊的数据存储类型。注意,如果需要对类型为地理位置的字段进行查找,一定要建立地理位置索引。
null 相当于一个占位符,表示一个字段存在但是值为空。
数据库的权限分为小程序端和管理端,管理端包括云函数端和控制台。小程序端运行在小程序中,读写数据库受权限控制限制,管理端运行在云函数上,拥有所有读写数据库的权限。云控制台的权限同管理端,拥有所有权限。小程序端操作数据库应有严格的安全规则限制。
初期我们对操作数据库开放以下几种权限配置,每个集合可以拥有一种权限配置,权限配置的规则是作用在集合的每个记录上的。出于易用性和安全性的考虑,云开发为云数据库做了小程序深度整合,在小程序中创建的每个数据库记录都会带有该记录创建者(即小程序用户)的信息,以 _openid 字段保存用户的 openid 在每个相应用户创建的记录中。因此,权限控制也相应围绕着一个用户是否应该拥有权限操作其他用户创建的数据展开。
以下按照权限级别从宽到紧排列如下:
- 仅创建者可写,所有人可读:数据只有创建者可写、所有人可读;比如文章。
- 仅创建者可读写:数据只有创建者可读写,其他用户不可读写;比如用私密相册。
- 仅管理端可写,所有人可读:该数据只有管理端可写,所有人可读;如商品信息。
- 仅管理端可读写:该数据只有管理端可读写;如后台用的不暴露的数据。
简而言之,管理端始终拥有读写所有数据的权限,小程序端始终不能写他人创建的数据,小程序端的记录的读写权限其实分为了 “所有人可读,只有创建者可写“、”仅创建者可读写“、”所有人可读,仅管理端可写“、”所有人不可读,仅管理端可读写“。
对一个用户来说,不同模式在小程序端和管理端的权限表现如下:
|
|
|
|
仅创建者可写,所有人可读
|
|
仅管理端可写,所有人可读
|
仅管理端可读写:该数据只有管理端可读写
|
在设置集合权限时应谨慎设置,防止出现越权操作。
在开始使用数据库 API 进行增删改查操作之前,需要先获取数据库的引用。以下调用获取默认环境的数据库的引用:
|
|
|
|
|
如字段值为数组,往数组尾部增加指定值
|
如字段值为数组,从数组尾部删除一个元素
|
如字段值为数组,从数组头部删除一个元素
|
如字段值为数组,往数组头部增加指定值
|
比如我们可以将一个待办事项的进度 +10%:
在大多数情况下,我们希望用户只能操作自己的数据(自己的代表事项),不能操作其他人的数据(其他人的待办事项),这就需要引入权限控制了。
接下来,我们看看如何控制集合与记录的读写权限,达到保护数据的目的。
建立索引是保证数据库性能、保证小程序体验的重要手段。我们应为所有需要成为查询条件的字段建立索引。建立索引的入口在控制台中,可分别对各个集合的字段添加索引。
对需要作为查询条件筛选的字段,我们可以创建单字段索引。如果需要对嵌套字段进行索引,那么可以通过 "点表示法" 用点连接起嵌套字段的名称。比如我们需要对如下格式的记录中的 color 字段进行索引时,可以用 style.color 表示。
在设置单字段索引时,指定排序为升序或降序并没有关系。在需要对索引字段按排序查询时,数据库能够正确的对字段排序,无论索引设置为升序还是降序。
组合索引即一个索引包含多个字段。当查询条件使用的字段包含在索引定义的所有字段或前缀字段里时,会命中索引,优化查询性能。索引前缀即组合索引的字段中定义的前 1 到多个字段,如有在 A, B, C 三个字段定义的组合索引 A, B, C,那么 A 和 A, B 都属于该索引的前缀。
组合索引具有以下特点:
1. 字段顺序决定索引效果
定义组合索引时,多个字段间的顺序不同是会有不同的索引效果的。比如对两个字段 A 和 B 进行索引,定义组合索引为 A, B 与定义组合索引为 B, A是不同的。当定义组合索引为 A, B 时,索引会先按 A 字段排序再按 B 字段排序。因此当组合索引设为 A, B 时,即使我们没有单独对字段 A 设立索引,但对字段 A
2. 字段排序决定排序查询是否可以命中索引
加入我们对字段 A 和 B 设置以下索引:
那么当我们查询需要对 A, B 进行排序时,可以指定排序结果为 A 升序 B 降序或 A 降序 B 升序,但不能指定为 A 升序 B 升序或 A 降序 B 降序。
创建索引时可以指定增加唯一性限制,具有唯一性限制的索引会要求被索引集合不能存在被索引字段值都相同的两个记录。即对任意具有唯一性限制的索引 I,假设其索引字段为 <F1, F2, ..., Fn>,则对集合 S 中任意的两个记录 R1 和 R2,必须满足条件 R1.F1 != R2.F1
&& R1.F2 != R2.F2 && ... && R1.Fn != R2.Fn。需特别注意的是,假如记录中不存在某个字段,则对索引字段来说其值默认为 null,如果索引有唯一性限制,则不允许存在两个或以上的该字段为空 / 不存在该字段的记录。
在创建索引的时候索引属性选择 唯一 即可添加唯一性限制。
云开发控制台支持从文件导入已有的数据。目前仅支持导入 CSV、JSON 格式的文件数据。
要导入数据,需打开云开发控制台,切换到 “数据库” 标签页,并选择要导入数据的集合,点击 “导入” 按钮。
选择要导入的 CSV 或者 JSON 文件,以及冲突处理模式,点击 “导入” 按钮即可开始导入。
JSON、CSV 文件必须是 UTF-8 的编码格式,且其内容类似 MongoDB 的导出格式,例如:
5、当使用 Insert 冲突处理模式时,同一文件不能存在重复的 _id 字段,或与数据库已有记录相同的 _id 字段;
6、CSV 格式的数据默认以第一行作为导入后的所有键名,余下的每一行则是与首行键名一一对应的键值记录。
目前提供了 Insert、Upsert 两种冲突处理模式。Insert 模式会在导入时总是插入新记录,Upsert 则会判断有无该条记录,如果有则更新记录,否则就插入一条新记录。
导入完成后,可以在提示信息中看到本次导入记录的情况。
云开发控制台支持导出集合已有的数据。目前仅支持导出 CSV、JSON 格式的文件数据。
要导出数据,需打开云开发控制台,切换到 “数据库” 标签页,并选择要导出数据的集合,点击 “导出” 链接。
选择要导出的格式、保存的位置,以及字段,点击 “导出” 按钮即可开始导出的过程。
当选择导出格式为 JSON 时,若不填写字段项,则默认导出所有数据。
当选择导出格式为 CSV 时,则字段为必填项。字段之间使用英文逗号隔开,例如:
从开发者工具 1.02. 版本开始,云开发提供了数据库回档功能。系统会自动开启数据库备份,并于每日凌晨自动进行一次数据备份,最长保存 7 天的备份数据。如有需要,开发者可在云控制台上通过新建回档任务将集合回档(还原)至指定时间点。
回档期间,数据库的数据访问不受影响。回档完成后,开发者可在集合列表中看到原有数据库集合和回档后的集合。
- 登录微信开发者工具的云开发控制台。
- 在数据库页面点击数据库回档后可新建回档任务。
- 点击新建回档后,可选择所需回档的时间点和需要回档的集合。请注意:
- 一次回档任务只能设置一个回档时间,所有待回档集合的回档时间都以此时间点为准;
- 一次回档任务可选择多个集合,点击全选可回档该环境下所有集合。
- 点击下一步后可设置回档后集合名称,请注意:
- 每个待回档集合都可单独设置回档后的集合名称;
- 系统会默认生成回档后的集合名称,生成规则为:待回档集合名称_bak;
- 回档后集合名称不可与已有集合名称重复。
- 点击确定后,开发者可在数据库回档页面查看回档进度。请注意:
- 为避免数据冲突,当前有回档任务在执行时,将无法创建新的回档任务;
- 回档完成后,开发者可在集合列表中看到原有数据库集合和回档后的集合。
回档已完成后,如有需要,开发者可在集合列表中选择对应集合,右键重命名该集合名称。