来源:互联网转载 | 更新日期:2023-09-09 11:04:21
微信小程序云开发[云数据库篇]
- 云数据库
- 关系型数据库和 JSON 数据库对比
- 数据类型
- 数据库操作
- 联表查询
- 事务处理
云数据库
云开发提供了一个 JSON 数据库,顾名思义,数据库中的每条记录都是一个 JSON 格式的对象。
一个数据库可以有多个集合(相当于关系型数据中的表),集合可看做一个 JSON 数组,数组中的每个对象就是一条记录,记录的格式是 JSON 对象。
关系型数据库和 JSON 数据库对比
数据类型
- String:字符串
- Number:数字
- Object:对象
- Array:数组
- Bool:布尔值
- Date:时间
- Geo:多种地理位置类型
- Point:点
- LineString:线段
- Polygon :多边形
- MultiPoint:点集合
- MultiLineString:线段集合
- MultiPolygon:多边形集合
- Null 相当于一个占位符,表示一个字段存在但是值为空
数据库操作
初始化(调用获取默认环境的数据库的引用) const db = wx.cloud.database()
通过数据库引用上的 collection 方法获取一个集合的引用const todos = db.collection('集合名')
在集合对象上调用 add 方法往集合中插入一条记录 db.collection('集合名').add({// data 字段表示需新增的 JSON 数据data: {name: "alice",age: 18}}).then(res => {//成功的处理console.log(res)}).catch(err => {//失败的处理})
记录和集合上都有提供 get 方法用于获取单个记录或集合中多个记录的数据//获取单条数据
db.collection('集合名').doc('数据id').get().then(res => {// res.data 包含该记录的数据console.log(res.data)
})//获取多条记录
db.collection('集合名').where({name : 'alice'
})
.get({success: function(res) {// res.data 是包含以上定义的两条记录的数组console.log(res.data)}
})
使用 update 方法可以只更新指定的字段,其他字段不受影响。 db.collection('集合名').doc('数据id').update({// data 传入需要局部更新的数据data: {name : 'alice'},success: function(res) {console.log(res.data)}
})//批量更新
//在云函数,可通过 where 语句选取多条记录执行删除
const cloud = require('wx-server-sdk')
const db = cloud.database()
const _ = db.commandexports.main = async (event, context) => {try {return await db.collection('集合名').where({name : 'alice'}).update({data: {age:100},})} catch(e) {console.error(e)}
}
对记录使用 remove 方法可以删除该条记录//删除单条记录
db.collection('集合名').doc('数据id').remove({success: function(res) {console.log(res.data)}
})//多条删除
//在云函数,可通过 where 语句选取多条记录执行删除
const cloud = require('wx-server-sdk')
const db = cloud.database()
const _ = db.commandexports.main = async (event, context) => {try {return await db.collection('集合名').where({name : 'alice'}).remove()} catch(e) {console.error(e)}
}
联表查询
与同个数据库下的一个指定的集合做 left outer join(左外连接)。对该阶段的每一个输入记录,lookup 会在该记录中增加一个数组字段,该数组是被联表中满足匹配条件的记录列表。
lookup({
from: <要连接的集合名>,
localField: <输入记录的要进行相等匹配的字段>,
foreignField: <被连接集合的要进行相等匹配的字段>,
as: <输出的数组字段名>
})
参数说明
具体操作
const db = cloud.database()db.collection('集合名').aggregate().lookup({from: '关联的集合名',localField: '关联字段',foreignField: '关联的集合名关联字段',as: '输出结果字段名',}).end().then(res => console.log(res)).catch(err => console.error(err))
事务处理
采用的是快照隔离,不支持批量操作
云函数中, 流程自定义控制的 startTransaction 接口
try {const transaction = await db.startTransaction()// ...await transaction.collection('集合名').doc('数据id').update({data: {name : 'alice'}})// 提交事务await transaction.commit()} catch (e) {console.error(`transaction error`)}
}