微信小程序:云数据库介绍

姓名:王祎  学号: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

插入数据

读取数据:读取数据

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容