From 2398cd6327e8f26e1e31d54f21ce00acd52ea73d Mon Sep 17 00:00:00 2001 From: VK <370725567@qq.com> Date: Thu, 30 May 2024 16:18:03 +0800 Subject: [PATCH] Update jql.md --- docs/jql.md | 111 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 70 insertions(+), 41 deletions(-) diff --git a/docs/jql.md b/docs/jql.md index 36b2e7f..1bb4673 100644 --- a/docs/jql.md +++ b/docs/jql.md @@ -86,7 +86,8 @@ sql写法,对js工程师而言有学习成本,而且无法处理非关系型 具体看以下示例 ```js - const db = uniCloud.database() + // 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() + const db = uniCloud.databaseForJQL() // 使用`jql`查询list表内`name`字段值为`hello-uni-app`的记录 db.collection('list') @@ -578,7 +579,8 @@ schema保存后,即使用JQL查询。查询表设为order和book这2个表名 ```js // 客户端联表查询 -const db = uniCloud.database() +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() const order = db.collection('order').field('book_id,quantity').getTemp() // 临时表field方法内需要包含关联字段,否则无法建立关联关系 const book = db.collection('book').field('_id,title,author').getTemp() // 临时表field方法内需要包含关联字段,否则无法建立关联关系 db.collection(order, book) // 注意collection方法内需要传入所有用到的表名,用逗号分隔,主表需要放在第一位 @@ -851,7 +853,8 @@ const res = await db.collection(order, 'book').where('uid==$cloudEnv_uid').get() ```js // 客户端联表查询 -const db = uniCloud.database() +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() const order = db.collection('order').field('book_id,quantity').getTemp() const book = db.collection('book').field('_id,title as book_title,author as book_author').getTemp() @@ -1166,7 +1169,8 @@ db.collection(article,comment).get() jql对查询条件进行了简化,开发者可以使用`where('a==1||b==2')`来表示字段`a等于1或字段b等于2`。如果不使用jql语法,上述条件需要写成下面这种形式 ```js -const db = uniCloud.database() +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() const dbCmd = db.command const res = await db.collection('test') .where( @@ -1251,7 +1255,8 @@ where内还支持使用云端环境变量,详情参考:[云端环境变量]( 使用如下写法可以筛选语文数学总分大于150的数据 ```js -const db = uniCloud.database() +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() const res = await db.collection('test') .where('add(chinese,math) > 150') .get() @@ -1274,7 +1279,8 @@ res = { 例:仍以上面的数据为例,以下查询语句可以查询数学得分比语文高的记录 ```js -const db = uniCloud.database() +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() const res = await db.collection('test') .where('math > chinese') .get() @@ -1312,7 +1318,8 @@ res = { 使用下面的写法可以查询deadline小于当前时间(云函数内的时间)的字段 ```js -const db = uniCloud.database() +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() const res = await db.collection('test') .where('deadline < new Date().getTime()') // 暂不支持使用Date.now(),后续会支持 .get() @@ -1327,7 +1334,8 @@ const res = await db.collection('test') 可以通过skip+limit来进行分页查询 ```js -const db = uniCloud.database() +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() db.collection('book') .where('status == "onsale"') .skip(20) // 跳过前20条 @@ -1401,7 +1409,8 @@ db.collection('order,book') // 注意collection方法内需要传入所有用到 field方法内可以不使用`{}`进行副表字段过滤,以上面示例为例可以写为 ```js -const db = uniCloud.database() +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() db.collection('order,book') .where('book_id.title == "三国演义"') .field('book_id.title,book_id.author,quantity as order_quantity') // book_id.title、book_id.author为副表字段,使用别名时效果和上一个示例不同,请见下方说明 @@ -1424,7 +1433,8 @@ db.collection('order,book') ```js // 客户端联表查询 -const db = uniCloud.database() +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() db.collection('book') .where('title == "三国演义"') .field('title as book_title,author as book_author') @@ -1456,7 +1466,8 @@ db.collection('book') ```js // 客户端联表查询 -const db = uniCloud.database() +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() db.collection('book') .where('title == "三国演义"') .field('_id as book_id,title as book_title,author as book_author') @@ -1489,7 +1500,8 @@ db.collection('book') ```js // 客户端联表查询 -const db = uniCloud.database() +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() db.collection('order,book') .where('book_id.title == "三国演义"') .field('book_id{title as book_title,author as book_author},quantity as order_quantity') // 这里联表查询book表返回book表内的title、book表内的author、order表内的quantity,并将title重命名为book_title,author重命名为book_author,quantity重命名为order_quantity @@ -1529,7 +1541,8 @@ db.collection('order,book') 副表字段使用别名需要注意,如果写成`.field('book_id.title as book_id.book_title,book_id.author,quantity as order_quantity')` book_title将会是由book_id下每一项的title组成的数组,这点和mongoDB内数组表现一致 ```js -const db = uniCloud.database() +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() db.collection('order,book') .where('book_id.title == "三国演义"') .field('book_id.title as book_title,book_id.author as book_author,quantity as order_quantity') // book_id.title、book_id.author为副表字段,使用别名时效果和上一个示例不同,请见下方说明 @@ -1640,7 +1653,8 @@ orderBy('quantity, create_date desc') 以上面的order表数据为例: ```js -const db = uniCloud.database() +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() db.collection('order') .orderBy('quantity asc, create_date desc') // 按照quantity字段升序排序,quantity相同时按照create_date降序排序 .get() @@ -1651,7 +1665,8 @@ const db = uniCloud.database() }) // 上述写法等价于 -const db = uniCloud.database() +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() db.collection('order') .orderBy('quantity','asc') .orderBy('create_date','desc') @@ -1696,19 +1711,20 @@ getOne其实等价于上一节的limit(1)。 ```js // 这以上面的book表数据为例 -const db = uniCloud.database() - db.collection('book') - .where({ - title: '西游记' - }) - .get({ - getOne:true - }) - .then(res => { - console.log(res); - }).catch(err => { - console.error(err) - }) +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() +db.collection('book') + .where({ + title: '西游记' + }) + .get({ + getOne:true + }) + .then(res => { + console.log(res); + }).catch(err => { + console.error(err) + }) ``` 返回结果为 @@ -2793,14 +2809,16 @@ data中不需要包括`_id`字段,数据库会自动维护该字段。 比如在user表里新增一个叫王五的记录: ```js -const db = uniCloud.database(); +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() db.collection('user').add({name:"王五"}) ``` 也可以批量插入数据并获取返回值 ```js -const db = uniCloud.database(); +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() const collection = db.collection('user'); let res = await collection.add([{ name: '张三' @@ -2817,7 +2835,8 @@ let res = await collection.add([{ ```js // 插入1条数据,同时判断成功失败状态 -const db = uniCloud.database(); +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() db.collection("user") .add({name: '张三'}) .then((res) => { @@ -2858,7 +2877,8 @@ collection.doc(_id).remove() ```js -const db = uniCloud.database(); +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() await db.collection("table1").doc("5f79fdb337d16d0001899566").remove() ``` @@ -2884,7 +2904,8 @@ try { ```js const dbCmd = db.command -const db = uniCloud.database(); +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() await db.collection("table1").where({ _id: dbCmd.neq(null) }).remove() @@ -2899,7 +2920,8 @@ await db.collection("table1").where({ 示例:判断删除成功或失败,打印删除的记录数量 ```js -const db = uniCloud.database(); +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() db.collection("table1") .where({ _id: "5f79fdb337d16d0001899566" @@ -2944,7 +2966,8 @@ collection.doc().update(Object data) ```js -const db = uniCloud.database(); +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() let collection = db.collection("table1") let res = await collection.where({_id:'doc-id'}) .update({ @@ -2980,7 +3003,8 @@ let res = await collection.where({_id:'doc-id'}) 更新数组时,以数组下标作为key即可,比如以下示例将数组arr内下标为1的值修改为 uniCloud ```js -const db = uniCloud.database(); +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() let collection = db.collection("table1") let res = await collection.where({_id:'doc-id'}) .update({ @@ -3006,7 +3030,8 @@ let res = await collection.where({_id:'doc-id'}) ### 批量更新文档 ```js -const db = uniCloud.database(); +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() let collection = db.collection("table1") let res = await collection.where("name=='hey'").update({ age: 18, @@ -3087,7 +3112,8 @@ unicloud-db组件也支持使用getTemp方法,结合multiSend可以与其他 }, methods: { test() { - const db = uniCloud.database() + // 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() + const db = uniCloud.databaseForJQL() const bannerQuery = this.$refs.udb.getTemp() // 调用模板内unicloud-db组件实例的getTemp方法 const noticeQuery = db.collection('notice').getTemp() db.multiSend(bannerQuery, noticeQuery) @@ -3116,7 +3142,8 @@ JQL API支持使用聚合操作读取数据,关于聚合操作请参考[聚合 例:取status等于1的随机20条数据 ```js -const db = uniCloud.database() +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() const res = await db.collection('test').aggregate() .match({ status: 1 @@ -3274,7 +3301,8 @@ db.collection('test').update({ **请求示例** ```js -const db = uniCloud.database() +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() const dbCmd = db.command const $ = dbCmd.aggregate db.collection('order') @@ -3423,7 +3451,8 @@ action是一种特殊的云函数,它不占用服务空间的云函数数量 ```js // 客户端发起请求,给todo表新增一行数据,同时指定action为add-todo -const db = uniCloud.database() +// 注意,此处的db是通过 uniCloud.databaseForJQL() 得到,而不是 uniCloud.database() +const db = uniCloud.databaseForJQL() db.action('add-todo') //注意action方法是db的方法,只能跟在db后面,不能跟在collection()后面 .collection('todo') .add({ -- GitLab