uniCloud 云函数操作云数据库-基础篇
1. database()
获取数据库对象
const db = uniCloud.database();//代码块为cdb
1.1 database.collection(name)
获取集合(类比于数据库中的表)
// 获取数据库对象
const db = uniCloud.database();
// 获取名为 table1 的集合
const table = db.collection("table1");
collection对象的方法
- 新增 add()
- 引用 doc()
- 获取 get()
- 计数 count()
- 条件 where()
- 设置起始位置 skip()
- 数据返回排序 orderBy()
- 设置查询数量 limit()
- 返回指定字段 field()
提示:
- collection对象的方法可以增和查数据,删和改不能直接操作,需要collection对象通过doc()或 get() 得到指定的记录后再调用 remove() 或 update() 方法进行删改。
- count、where、skip、orderBy、limit、field 方法要 get() 结合使用,只有当调用 get() 时,才会真正的发送查询请求,其他方法则是为了查询更精准的数据而去设置查询条件
1.1.1 collection.add()
新增记录(触发请求),支持单条和批量两种方式
入参
参数 | 类型 | 必填 |
data | object / array | 是 |
响应参数
单条插入
参数 | 类型 | 说明 |
id | String | 插入记录的id |
批量插入
参数 | 类型 | 说明 |
inserted | Number | 插入成功条数 |
ids | Array | 批量插入所有记录的id |
创建一条新记录,每条记录都会自带一个_id字段用以作为该记录的唯一标志。_id字段是每个数据表默认自带且不可删除的字段。同时它也是数据表的索引。
// 云函数写法,后续写法省略 exports
'use strict';
// 获取数据库对象
const db = uniCloud.database();
// 运行 在云端(服务器端)的函数
exports.main = async (event, context) => {
// 获取名为 user 的集合
const user_table = db.collection("user");
// 单条插入
let res = await user_table.add({
name: 'Ben',
type: {
className: '一年级'
}
})
// 批量插入
let res2 = await user_table.add([
{
name: 'Alex',
type: {
className: '一年级'
}
},{
name: 'Ben',
type: {
className: '三年级'
}
},{
name: 'John'
}
])
return {
code: 200,
msg: '添加成功',
data: res2
}
}
1.1.2 collection.doc()
首先记住引用≠获取到了数据。获取对该集合中指定 id 的记录的引用(引用的用途是为了实现对唯一数据的进行更新、删除操作,也可以通过该引用直接获取到该记录)
引用对象的方法
- 覆盖整条数据,如果不存在则创建 set()
- 更新局部数据 update()
- 删除数据 remove()
- 获取数据 get()
// 1. 将id为1的数据覆盖
let res = await collection.doc('1').set({
name: "Ben",
type: {
className: '五年级'
}
})
// 2. 将id为1的数据 name 字段更新为 Ben2
let res2 = await collection.doc('1').update({
name: "Ben2"
});
// 3. 如果集合包含数组结构,可以通过下标进行更新,例如:
// {
// "_id": "doc-id",
// "arr": ["hello", "uniCloud"]
//}
// let res = await collection.doc('doc-id').update({
// arr: {
// 1: "uniCloud"
// }
//})
// 4. 删除全部数据
let res3 = await collection.get()
res.data.map(async(document) => {
return await collection.doc(document.id).remove();
});
// 5. 获取记录
let res4 = await collection.doc('1').get();
1.1.2.1 doc.set()
更新文档,如果不存在则创建,此方法会覆写已有字段,需注意与update表现不同
1.1.2.2 doc.update()
未使用set、remove更新操作符的情况下,此方法不会删除字段,仅将更新数据和已有数据合并。
入参
参数 | 类型 | 必填 |
data | object | 是 |
响应参数
参数 | 类型 | 说明 |
updated | Number | 更新成功条数,数据更新前后没变化时会返回0 |
1.1.2.3 doc.remove()
通过指定ID删除
响应参数
参数 | 类型 | 说明 |
deleted | Number | 删除的记录数量 |
const db = uniCloud.database();
db.collection("user").doc("1").remove()
.then((res) => {
console.log("删除成功,删除条数为: ",res.deleted);
})
.catch((err) => {
console.log( err.message )
})
.finally(() => {
})
1.1.3 collection.get()
获取集合中的记录,如果有使用 where 语句定义查询条件,则会返回匹配结果集 (触发请求)
1.1.4 collection.count()
获取符合条件的记录条数
响应参数
参数 | 类型 | 说明 |
total | Number | 计数结果 |
// 获取数据库对象
const db = uniCloud.database();
// 获取名为 user 的集合
const user_table = db.collection("user");
let res = await user_table.where({
name: 'Ben',
type: {
className: '三年级',
}
}).count()
return {
code: 200,
msg: '查询成功',
data: res2.total
}
1.1.5 collection.where()
设置过滤条件,where 可接收对象作为参数,表示筛选出拥有和传入对象相同的 key-value 的数据
// 获取数据库对象
const db = uniCloud.database();
// 获取名为 user 的集合
const user_table = db.collection("user");
// 获取name为 Ben 的数据
let res = await user_table.where({
name: 'Ben'
}).get()
return {
code: 200,
msg: '查询成功',
data: res.total
}
where 除了上面设置过滤条件外,还可以通过高级查询指令进行查询,下篇会进行讲解。
1.1.6 collection.skip()
设置起始位置
入参
参数 | 类型 | 说明 |
value | Number | 跳过指定的位置,返回该位置之后的数据 |
let res = await collection.skip(4).get()
数据量很大的情况下,skip性能会很差,建议使用分页的形式处理
1.1.7 collection.orderBy()
结果排序
入参
参数 | 类型 | 说明 |
field | string | 排序的字段 |
orderType | string | 排序的顺序,升序(asc) 或 降序(desc) |
let res = await collection.orderBy("name", "asc").get()
1.1.8 collection.limit()
设置返回的数据数量,默认返回100条数据;设置limit有最大值,腾讯云限制为最大1000条,阿里云限制为最大500条。
入参
参数 | 类型 | 说明 |
value | Number | 返回的数据条数 |
let res = await collection.limit(1).get() // 只返回第一条记录
1.1.9 collection.field()
指定返回字段
collection.field({ 'name': true }) //只返回name字段、_id字段,其他字段不返回