文章目录
- 学习前后
- 云数据库的基础知识
- 数据库权限限制
- 简易权限配置
- 安全规则
- 数据库查询
- 查询指令command
- 条件查询法一:Collection.where
- 条件查询法二:Collection.field
- 条件查询法三:Collection.orderBy
- 条件查询法四:Collection.skip
- 条件查询法五:Collection.limit
- 正则查询Database.RegExp
- 在小程序端新增记录和统计记录
- 操作单个数据doc
- 查询单个doc值get
- 删除单个记录remove
- 更新单条记update
- 替换更新记录set
学习前后
上一篇:微信小程序开发之十七 —— 云开发能力 下一篇: 先咕着
云数据库的基础知识
数据库有数据库database、集合collection、记录doc以及字段field,可执行操作有增、删、改、查
数据库权限限制
上一篇末尾我们提到,导入的数据默认权限是仅创建者可读写,那数据库的权限又怎么划分的呢,我们先看一下文档怎么说
官方文档:权限控制
里面分为安全规则与简易权限配置
简易权限配置
上一篇看到的那个权限选项就是简易权限设置,出于易用性和安全性的考虑,云开发为云数据库做了小程序深度整合,在小程序中创建的每个数据库记录都会带有该记录创建者(即小程序用户)的信息,以 _openid 字段保存用户的 openid 在每个相应用户创建的记录中。因此,权限控制也相应围绕着一个用户是否应该拥有权限操作其他用户创建的数据展开。
简易权限级别从宽到紧排列分为四种:
- 仅创建者可写,所有人可读:数据只有创建者可写、所有人可读;比如文章。
- 仅创建者可读写:数据只有创建者可读写,其他用户不可读写;比如用私密相册。
- 仅管理端可写,所有人可读:该数据只有管理端可写,所有人可读;如商品信息。
- 仅管理端可读写:该数据只有管理端可读写;如后台用的不暴露的数据。
安全规则
安全规则的编写更加灵活,官方也建议开发者使用新推出的数据库安全规则取代基础权限配置,可以让数据库访问的行为更加明确。
下面我列举一下新自定义安全规则与旧权限配置的对应关系,更多编写方式可查看官方文档。
我们可以在控制台对各个集合分别配置安全规则,入口在集合权限配置页,在基础的四种权限配置外还提供了 “自定义规则” 的选项。这个是最新版才出的功能,而我的是老早之前就下载的旧版了所以看不到这个入口,但还是可以了解一下。
所有用户可读,仅创建者可写
{
"read": true,
"write": "doc._openid == auth.openid"
}
仅创建者可读写
{
"read": "doc._openid == auth.openid",
"write": "doc._openid == auth.openid"
}
所有用户可读
{
"read": true,
"write": false
}
所有用户不可读写
{
"read": false,
"write": false
}
更多写法请看官方文档,还有很多具体的权限配置:安全规则
数据库查询
先下载个数据中国城市经济数据,然后导入到云开发数据库集合china中,集合名称可自定义,配置好集合权限为"所有人可读,仅创建者可读写"(使用安全规则编写也可,这里我的是旧版所以没法设置安全规则),数据内容是:名称city、省份province、市区面积city_area、建成区面积builtup_area、户籍人口reg_pop、常住人口resident_pop、GDP的数据。
查询指令command
官方文档:Command 指令Command可以分为查询指令和更新指令,这两者的用法有很大的区别,查询指令用于db.collection的where条件筛选,而更新指令则是用于db.collection.doc的update请求的字段的更新里。
查询指令:
gt | 大于 | lt | 小于 |
eq | 等于 | neq | 不等于 |
lte | 小于或等于 | gte | 大于或等于 |
in | 在数组中 | nin | 不在数组中 |
and | 条件与 | or | 条件或 |
not | 条件非 | nor | 都不 |
command指令写法:
比如写大于1000的指令
wx.cloud.database().command.gt(1000)
一般我们会把wx.cloud.database()
赋值给一个变量,一般为db
,然后将db.command()
赋值给_
,最后代码变成_.gt(1000)
,达到简化效果。
逻辑and写法
.where({
province:_.eq("广东")
gdp:_.gt(1000).and(_.lt(10000))
})
where后面会讲,一个刷选数据的方法,这里表示选出广东gdb大于一千小于一万的城市。
逻辑or写法
.where(
{
gdb: _.gt(2000)
resident_pop: _.gt(500),
},
_.or([{
builtup_area: _.gt(300)}
]),
)
表示查询中国gdp在2000亿元以上且常住人口500万人以上或建成面积在300平方公里以上的城市。
条件查询法一:Collection.where
官方文档:Collection.where 指定查询条件,返回带新查询条件的新的集合引用
const db = wx.clound.database()
const _ = db.command
db.collection("china")
.where({
gdp: _.gt(5000)
})
.get() //获取根据查询条件筛选后的集合数据
.then(res => {
console.log(res.data)
})
.catch(err => {
console.error(err)
})
筛选gdp在5000亿元以上的城市。
条件查询法二:Collection.field
官方文档:Collection.field 指定返回结果中记录需返回的字段。
说明
方法接受一个必填对象用于指定需返回的字段,对象的各个 key 表示要返回或不要返回的字段,value 传入 true|false(或 1|-1)表示要返回还是不要返回。
前面那个输出的数据有些我们并不想知道,这时就可以使用.filed来将这些数据隐藏不输出,哪些数据输出,不写的key默认不显示,_id除外。
const db = wx.clound.database()
const _ = db.command
db.collection("china")
.where({
gdp: _.gt(5000)
})
.field({ //显示哪些字段
_id: false, //默认显示_id,这个隐藏
city: true,
province: true,
gdp: true
})
.get() //获取根据查询条件筛选后的集合数据
.then(res => {
console.log(res.data)
})
.catch(err => {
console.error(err)
})
结果:
条件查询法三:Collection.orderBy
官方文档:Collection.orderBy 指定查询排序条件
说明
方法接受一个必填字符串参数 fieldName 用于定义需要排序的字段,一个字符串参数 order 定义排序顺序。order 只能取 asc 或 desc,asc表示升序,dasc表示降序。
如果需要对嵌套字段排序,需要用 “点表示法” 连接嵌套字段,比如 style.color 表示字段 style 里的嵌套字段 color。
同时也支持按多个字段排序,多次调用 orderBy 即可,多字段排序时的顺序会按照 orderBy 调用顺序先后对多个字段排序
const db = wx.cloud.database() //获取数据库的引用
const _ = db.command //获取数据库查询及更新指令
db.collection("china")
.where({
gdp: _.gt(5000)
})
.field({
_id: false, //默认显示_id,这个隐藏
city: true,
province: true,
gdp: true
})
.orderBy('gdp', 'desc')
.get() //获取根据查询条件筛选后的集合数据
.then(res => {
console.log(res.data)
})
.catch(err => {
console.error(err)
})
这样我们就可以将得到的数据按gdp进行降序排序了。
条件查询法四:Collection.skip
官方文档:Collection.skip 指定查询返回结果时从指定序列后的结果开始返回,常用于分页。
条件查询法五:Collection.limit
官方文档:Collection.limit 指定查询结果集数量上限。
limit 在小程序端默认及最大上限为 20,在云函数端默认及最大上限为 1000。
const db = wx.cloud.database() //获取数据库的引用
const _ = db.command //获取数据库查询及更新指令
db.collection("china") //获取集合china的引用
.where({
gdp: _.gt(5000)
})
.field({
_id: false, //默认显示_id,这个隐藏
city: true,
province: true,
gdp: true
})
.orderBy('gdp', 'desc')
.skip(0)
.limit(10)
.get() //获取根据查询条件筛选后的集合数据
.then(res => {
console.log(res.data)
})
.catch(err => {
console.error(err)
})
结果:
正则查询Database.RegExp
官方文档:Database.RegExp
如:
.where({
city: db.RegExp({
regexp: '州',
options: 'i',
})
})
在小程序端新增记录和统计记录
集合数据请求的查询方法除了get查询外,请求的方法还有add新增,remove删除、update改写/更新、count统计以及watch监听,我又想偷懒了,给大家附上官方文档
官方文档:Collection.get, ,Collection.update,Collection.remove,Collection.count,Collection.add,Collection.watch
操作单个数据doc
Document的四个请求方法:获取单个记录数据Document.get()、删除单个记录Document.remove()、更新单个记录Document.update()、替换更新单个记录Document.set()。和基于Collection不一样的是,前者的增删改查是可以批量多条的,而基于Document则是操作单条记录。
查询单个doc值get
官方文档:Document.get() 获取记录数据,或获取根据查询条件筛选后的记录数据
db.collection('data').doc("ffd789435f1bf51500260e0369102407")
.get()
.then(res => {
console.log('单个记录的值', res.data)
})
.catch(err => {
console.error(err)
})
doc里面的值是_id的值,这里调用的是我们上一篇的知乎的数据库
结果:
删除单个记录remove
官方文档:Document.remove 大家自行编写组件绑定函数即可
removeDaily(){
db.collection('data').doc("daily9718006")
.remove()
.then(console.log)
.catch(console.error)
}
更新单条记update
官方文档:Document.update
updateDaily(){
db.collection('data').doc("ffd789435f1bf51500260e014f5e8b8e")
.update({
data:{
title: "【知乎日报】小程序修改的标题",
}
})
},
替换更新记录set
官方文档:Document.set
setDaily(){
db.collection('zhihu_daily').doc("ffd789435f1bf51500260e014f5e8b8e")
.set({
data: {
"title": "为什么狗会如此亲近人类?",
"images": [
"https://pic4.zhimg.com/v2-4cab2fbf4fe9d487910a6f2c54ab3ed3.jpg"
],
"id": 9717547,
"url": "https://daily.zhihu.com/story/9717547",
"image": "https://pic4.zhimg.com/v2-60f220ee6c5bf035d0eaf2dd4736342b.jpg",
"share_url": "http://daily.zhihu.com/story/9717547",
"body": "<p>让狗从凶猛的野兽变成忠实的爱宠,涉及了宏观与微观上的两层故事:我们如何在宏观上驯养了它们,以及这些驯养在生理层面究竟意味着什么。</p>\r\n<p><img class=\"content-image\" src=\"http://pic1.zhimg.com/70/v2-4147c4b02bf97e95d8a9f00727d4c184_b.jpg\" alt=\"\"></p>\r\n<p>狗是灰狼(Canis lupus)被人类驯养后形成的亚种,至少可以追溯到 1 万多年以前,是人类成功驯化的第一种动物。在这漫长的岁月里,人类的定向选择强烈改变了这个驯化亚种的基因频率,使它呈现出极高的多样性,尤其体现在生理形态上。</p>"
}
})
}
云数据库就更到这了,更多内容请看官方文档。