学习JQL语法,更方便我们使用条件语句的查询,之前的查询需要我们使用下方的代码,使用JQL可以更简便
const db = uniCloud.database()
const dbCmd = db.command
let res = await db.collection('table1').where({
field1: dbCmd.gt(0)
}).get()
-
补充一下退出登录的功能(一般我们都会直接把本地存储的token删除,但是在uni-id中有退出登录的方法,可以直接调用)
- 图中的store.js中有封装的一些方法,我们可以直接使用(当然你也可以直接在那个文件中进行修改)
<template>
<view class="content">
<button @click="createdDb">新增</button>
<button @click="updateDb">修改</button>
<button @click="login">登录</button>
<button @click="loginOut">退出登录</button>
</view>
</template>
<script>
import { mutations } from '../../uni_modules/uni-id-pages/common/store.js'
const db = uniCloud.database();
export default {
setup() {
const login = ()=>{
uni.navigateTo({
url:'/uni_modules/uni-id-pages/pages/login/login-withpwd'
})
}
const loginOut= ()=>{
mutations.logout()
}
const updateDb = ()=>{
db.collection('test').doc('646c6d6609e2989198080bd6').update({
title:'我是修改后的数据'
}).then(res=>{
console.log(res);
})
}
const createdDb = () => {
db.collection('test')
.add({
title:'文章333',
content:'我是文章内容'
})
.then((res) => {
console.log(res);
});
};
return {
createdDb,
updateDb,
loginOut,
login
};
}
};
</script>
<style lang="scss"></style>
- 查询的jql
1、以前的查询(需要在对象格式里面写)
db.collection('user').where({
id:'1111'
}).get()
2、jql的查询(可以直接写我们要查询的条件)
//先进行添加
db.collection('test')
.add({
title: '文章333',
content: '我是文章内容'
})
.then((res) => {
console.log(res);
});
//查询
db.collection('test')
.where("title=='文章333'")
.get()
.then((res) => {
console.log(res);
});
注意: 使用schema表返回状态等是定义好的,我们要是想修改怎么办呢?只能使用action云函数进行修改,相当于是axios的拦截和响应进行处理我们需要的格式
- 先在云函数文件下新建一个文件uni.clientDB-actions,在这个文件夹下新建我们的.js文件就好,如err-msg.js
// 一个action文件示例 uni-clientDB-actions/add-todo.js
module.exports = {
// 在数据库操作之前执行
before: async(state,event)=>{
},
// 在数据库操作之后执行
after:async (state,event,error,result)=>{
// state为当前数据库操作状态其格式见下方说明
// event为传入云函数的event对象
// error为执行操作的错误对象,如果没有错误error的值为null
// result为执行command返回的结果
console.log(state,event,error,result,'actions---------');
if(error) {
throw error
}
if(state.collection ==='test'){//请求的表为test表,具体的实现可以使用event我们传入的值进行判断也可以
if(!error){
result.errMsg='查询成功'
result.errCode=200
return result
}else{
result.errMsg='查询失败'
result.errCode=500
return result
}
}
return result
}
}
- 在页面中的使用,action一定要放到collection前面
//err-msg这个就是我们创建的action文件名
db.action('err-msg').collection('test')
.where("title=='文章333'")
get()
.then((res) => {
console.log(res);
});
联表查询,上面的查询是单表查询就是单独一张表进行查询,联表查询:意思就是可以两张表或多张表进行查询,但是必须都依赖同一个主表,这样才可以进行多张一起查询
- 下方的写法推荐使用第二种
// 直接关联多个表为虚拟联表再进行查询,旧写法,目前更推荐使用getTemp进行联表查询
const res = await db.collection('order,book').where('_id=="1"').get() // 直接关联order和book之后再过滤
// 使用getTemp先过滤处理获取临时表再联表查询,推荐用法
const order = db.collection('order').where('_id=="1"').getTemp() // 注意结尾的方法是getTemp,对order表过滤得到临时表
const res = await db.collection(order, 'book').get() // 将获取的order表的临时表和book表进行联表查询
- 看我们的项目中,使用了uni-id-users表中的id进行关联,所以uni-id-users是主表,其他关联的都是副表
const test = db.collection('test').field('userId,title,content').getTemp()//虚拟联表
const test1 = db.collection('test1').field('userId,title,num').getTemp()
const user = db.collection('uni-id-users').field('_id,username').getTemp()
db.collection(user,test,test1).get().then(res=>{
console.log(res);
})
注意: 上面的db.collection(test,user)。test在前就会直接返回userId为属性的将user数据包裹在里面,反之亦然,要是user在前会以_id为属性,返回的结果是不一样的
-
test在前
-
user在前
这个看个人习惯,不过我喜欢将主表的放在后面,结构更清晰一些
联表字段别名as
将主表中的username使用别名修改为name--- username as name
const test = db.collection('test').field('title,content,userId').getTemp()//虚拟联表
const user = db.collection('uni-id-users').field('_id,username as name,nickname').getTemp()
db.collection(test,user).get().then(res=>{
console.log(res);
})
-
还有查询中的方法where("add(num,price)"),具体的可以查询官方文档进行查看