姓名:王祎 学号:20021210956
转载自:https://www.w3cschool.cn/weixinapp/weixinapp-hyko2zdp.html
【嵌牛导读】:开发者可以使用云开发开发微信小程序、小游戏,无需搭建服务器,即可使用云端能力。云开发为开发者提供完整的原生云端支持和微信服务支持,弱化后端和运维概念,无需搭建服务器,使用平台提供的 API 进行核心业务开发,即可实现快速上线和迭代,同时这一能力,同开发者已经使用的云服务相互兼容,并不互斥。
【嵌牛鼻子】:微信小程序云数据库
【嵌牛提问】:微信小程序中的数据库是什么?如何将数据导入数据库中?如何应用数据库?
【嵌牛正文】:
上手云数据库
这一节我们将介绍如何在控制台中创建我们的第一个数据库集合、往集合上插入数据、以及在控制台中查看刚刚插入的数据。
一、创建第一个集合
打开控制台,选择 "数据库" 标签页,通过 "添加集合" 入口创建一个集合。假设我们要创建一个待办事项小程序,我们创建一个名为 todos 的集合。创建成功后,可以看到 todos 集合管理界面,界面中我们可以添加记录、查找记录、管理索引和管理权限。
二、创建第一条记录
控制台提供了可视化添加数据的交互界面,点击 "添加记录" 添加我们的第一条待办事项:
{// 描述,String 类型"description":"learn mini-program cloud service",// 截止时间,Date 类型"due":Date("2018-09-01"),// 标签,Array 类型"tags": ["tech","mini-program","cloud"],// 个性化样式,Object 类型"style": {"color":"red"},// 是否已完成,Boolean 类型"done":false}
添加完成后可在控制台中查看到刚添加的数据。
三、导入数据
云控制台支持上传文件导入已有的数据,可查看导入指引了解如何操作。
下面为具体操作:
1.初始化
在开始使用数据库 API 进行增删改查操作之前,需要先获取数据库的引用。以下调用获取默认环境的数据库的引用:
constdb = wx.cloud.database()
如需获取其他环境的数据库引用,可以在调用时传入一个对象参数,在其中通过 env 字段指定要使用的环境。此时方法会返回一个对测试环境数据库的引用。
示例:假设有一个环境名为 test,用做测试环境,那么可以如下获取测试环境数据库:
consttestDB = wx.cloud.database({ env:'test'})
要操作一个集合,需先获取它的引用。在获取了数据库的引用后,就可以通过数据库引用上的 collection 方法获取一个集合的引用了,比如获取待办事项清单集合:
consttodos = db.collection('todos')
获取集合的引用并不会发起网络请求取拉取它的数据,我们可以通过此引用在该集合上进行增删查改的操作,除此之外,还可以通过集合上的 doc 方法来获取集合中一个指定 ID 的记录的引用。同理,记录的引用可以用于对特定记录进行更新和删除操作。
假设我们有一个待办事项的 ID 为 todo-identifiant-aleatoire,那么我们可以通过 doc 方法获取它的引用:
consttodo = db.collection('todos').doc('todo-identifiant-aleatoire')
接下来,我们看看如何往集合中插入数据。
2.插入数据
可以通过在集合对象上调用 add 方法往集合中插入一条记录。还是用待办事项清单的例子,比如我们想新增一个待办事项:
db.collection('todos').add({// data 字段表示需新增的 JSON 数据data: {// _id: 'todo-identifiant-aleatoire', // 可选自定义 _id,在此处场景下用数据库自动分配的就可以了description:"learn cloud database", due:newDate("2018-09-01"), tags: ["cloud","database"],// 为待办事项添加一个地理位置(113°E,23°N)location:newdb.Geo.Point(113,23), done:false}, success:function(res){// res 是一个对象,其中有 _id 字段标记刚创建的记录的 idconsole.log(res) }})
当然,Promise 风格也是支持的,只要传入对象中没有 success, fail 或 complete,那么 add 方法就会返回一个 Promise:
db.collection('todos').add({// data 字段表示需新增的 JSON 数据data: { description:"learn cloud database", due:newDate("2018-09-01"), tags: ["cloud","database"], location:newdb.Geo.Point(113,23), done:false}}).then(res => {console.log(res)})
数据库的增删查改 API 都同时支持回调风格和 Promise 风格调用。
在创建成功之后,我们可以在控制台中查看到刚新增的数据。
可以在 add API 文档中查阅完整的 API 定义。
接下来,我们将学习如何使用 API 查询到刚插入的数据。
3.读取数据
在记录和集合上都有提供 get 方法用于获取单个记录或集合中多个记录的数据。
假设我们已有一个集合 todos,其中包含以下格式记录:
[ { _id:'todo-identifiant-aleatoire', _openid:'user-open-id',// 假设用户的 openid 为 user-open-iddescription:"learn cloud database", due:Date("2018-09-01"), progress:20, tags: ["cloud","database"], style: { color:'white', size:'large'}, location: Point(113.33,23.33),// 113.33°E,23.33°Ndone:false}, { _id:'todo-identifiant-aleatoire-2', _openid:'user-open-id',// 假设用户的 openid 为 user-open-iddescription:"write a novel", due:Date("2018-12-25"), progress:50, tags: ["writing"], style: { color:'yellow', size:'normal'}, location: Point(113.22,23.22),// 113.22°E,23.22°Ndone:false}// more...]
4.获取一个记录的数据
我们先来看看如何获取一个记录的数据,假设我们已有一个 ID 为 todo-identifiant-aleatoire 的在集合 todos 上的记录,那么我们可以通过在该记录的引用调用 get 方法获取这个待办事项的数据:
db.collection('todos').doc('todo-identifiant-aleatoire').get({ success:function(res){// res.data 包含该记录的数据console.log(res.data) }})
也可以用 Promise 风格调用:
db.collection('todos').doc('todo-identifiant-aleatoire').get().then(res => {// res.data 包含该记录的数据console.log(res.data)})
获取多个记录的数据
我们也可以一次性获取多条记录。通过调用集合上的 where 方法可以指定查询条件,再调用 get 方法即可只返回满足指定查询条件的记录,比如获取用户的所有未完成的待办事项:
db.collection('todos').where({ _openid:'user-open-id', done:false}).get({ success:function(res){// res.data 是包含以上定义的两条记录的数组console.log(res.data) }})
where 方法接收一个对象参数,该对象中每个字段和它的值构成一个需满足的匹配条件,各个字段间的关系是 "与" 的关系,即需同时满足这些匹配条件,在这个例子中,就是查询出 todos 集合中 _openid 等于 user-open-id 且 done 等于 false 的记录。在查询条件中我们也可以指定匹配一个嵌套字段的值,比如找出自己的标为黄色的待办事项:
db.collection('todos').where({ _openid:'user-open-id', style: { color:'yellow'}}).get({ success:function(res){console.log(res.data) }})
也可以用 "点表示法" 表示嵌套字段:
db.collection('todos').where({ _openid:'user-open-id','style.color':'yellow'}).get({ success:function(res){console.log(res.data) }})
获取一个集合的数据
如果要获取一个集合的数据,比如获取 todos 集合上的所有记录,可以在集合上调用 get 方法获取,但通常不建议这么使用,在小程序中我们需要尽量避免一次性获取过量的数据,只应获取必要的数据。为了防止误操作以及保护小程序体验,小程序端在获取集合数据时服务器一次默认并且最多返回 20 条记录,云函数端这个数字则是 100。开发者可以通过 limit 方法指定需要获取的记录数量,但小程序端不能超过 20 条,云函数端不能超过 100 条。
db.collection('todos').get({ success:function(res){// res.data 是一个包含集合中有权限访问的所有记录的数据,不超过 20 条console.log(res.data) }})
也可以用 Promise 风格调用:
db.collection('todos').get().then(res => {// res.data 是一个包含集合中有权限访问的所有记录的数据,不超过 20 条console.log(res.data)})
下面是在云函数端获取一个集合所有记录的例子,因为有最多一次取 100 条的限制,因此很可能一个请求无法取出所有数据,需要分批次取:
constcloud =require('wx-server-sdk')cloud.init()constdb = cloud.database()constMAX_LIMIT =100exports.main =async(event, context) => {// 先取出集合记录总数constcountResult =awaitdb.collection('todos').count()consttotal = countResult.total// 计算需分几次取constbatchTimes =Math.ceil(total /100)// 承载所有读操作的 promise 的数组consttasks = []for(leti =0; i < batchTimes; i++) {constpromise = db.collection('todos').skip(i * MAX_LIMIT).limit(MAX_LIMIT).get() tasks.push(promise) }// 等待所有return(awaitPromise.all(tasks)).reduce((acc, cur) => {return{ data: acc.data.concat(cur.data), errMsg: acc.errMsg, } })}
需要注意以下几点:
(1)JSON 数据不是数组,而是类似 JSON Lines,即各个记录对象之间使用 \n 分隔,而非逗号;
(2)JSON 数据每个键值对的键名首尾不能是 .,例如 ".a"、"abc.",且不能包含多个连续的 .,例如 "a..b";
(3)键名不能重复,且不能有歧义,例如 {"a": 1, "a": 2} 或 {"a": {"b": 1}, "a.b": 2};
(4)时间格式须为 ISODate 格式,例如 "date": { "$date" : "2018-08-31T17:30:00.882Z" };
(5)当使用 Insert 冲突处理模式时,同一文件不能存在重复的 _id 字段,或与数据库已有记录相同的 _id 字段;
(6)CSV 格式的数据默认以第一行作为导入后的所有键名,余下的每一行则是与首行键名一一对应的键值记录。
目前提供了 Insert、Upsert 两种冲突处理模式。Insert 模式会在导入时总是插入新记录,Upsert 则会判断有无该条记录,如果有则更新记录,否则就插入一条新记录。
导入完成后,可以在提示信息中看到本次导入记录的情况。
5.数据库导出
云开发控制台支持导出集合已有的数据。目前仅支持导出 CSV、JSON 格式的文件数据。
要导出数据,需打开云开发控制台,切换到 “数据库” 标签页,并选择要导出数据的集合,点击 “导出” 链接。
选择要导出的格式、保存的位置,以及字段,点击 “导出” 按钮即可开始导出的过程。
当选择导出格式为 JSON 时,若不填写字段项,则默认导出所有数据。
当选择导出格式为 CSV 时,则字段为必填项。字段之间使用英文逗号隔开,例如:
_id,name,age,gender
6.数据库备份与回档
从开发者工具 1.02.202002282 版本开始,云开发提供了数据库回档功能。系统会自动开启数据库备份,并于每日凌晨自动进行一次数据备份,最长保存 7 天的备份数据。如有需要,开发者可在云控制台上通过新建回档任务将集合回档(还原)至指定时间点。
回档期间,数据库的数据访问不受影响。回档完成后,开发者可在集合列表中看到原有数据库集合和回档后的集合。
7.新建回档
登录微信开发者工具的云开发控制台。
在数据库页面点击数据库回档后可新建回档任务。
点击新建回档后,可选择所需回档的时间点和需要回档的集合。请注意:
一次回档任务只能设置一个回档时间,所有待回档集合的回档时间都以此时间点为准;
一次回档任务可选择多个集合,点击全选可回档该环境下所有集合。
点击下一步后可设置回档后集合名称,请注意:
每个待回档集合都可单独设置回档后的集合名称;
系统会默认生成回档后的集合名称,生成规则为:待回档集合名称_bak;
回档后集合名称不可与已有集合名称重复。
点击确定后,开发者可在数据库回档页面查看回档进度。请注意:
为避免数据冲突,当前有回档任务在执行时,将无法创建新的回档任务;
回档完成后,开发者可在集合列表中看到原有数据库集合和回档后的集合。
8.重命名集合
回档已完成后,如有需要,开发者可在集合列表中选择对应集合,右键重命名该集合名称。
【嵌牛总结】:
云开发提供了一个 JSON 数据库,本文介绍了以下内容:
上手:用控制台创建我的第一个集合,插入我的第一条数据
数据类型:了解数据库提供的数据类型
权限控制:控制集合与记录的读写权限
初始化:初始化数据库 API
插入数据
读取数据:读取数据