追梦随想
追梦随想
  • 发布:2024-03-23 13:00
  • 更新:2024-03-23 13:00
  • 阅读:68

【吐槽】JQL的联表查询真的很low,能否向mysql靠拢呢

分类:uniCloud

今天发现一个联表查询的问题,按官方的说法是推荐用临时表的形式,提高查询速度,如下:

        const free_goods = await this.dbJQL.collection('free_goods').where(`is_on_sale == true`)  
            .field('goods_id, goods_sku, consume_count').orderBy('_id desc').skip(offset).limit(size).getTemp();  
        console.log(free_goods);  

        const goods_list = await this.dbJQL.collection(free_goods, 'goods').get();  
        console.log(goods_list.data);

这里有一个致命的问题,副表内的字段不能有配置禁读权限,否则就会提示

权限校验未通过,未能获取当前用户信息,The login status is invalid, token has expired

最开始我也不知道咋回事,快被折磨疯了,明明两个表的权限全部打开了,就是不通过,最后发现是他奶奶的有个字段配置了独立权限,删除就正常了,但是问题就来了,既然联表查询不能配置,那么这个字段级权限配置的意义在哪儿??双方互相打架吗?我们这些码农就遭殃了啊。。。

然后我就在想,能不能在查询的时候过滤字段?

        const field = '_id, title, thumbnail, market_price, sell_price';  
        const goods = await this.dbJQL.collection(free_goods, 'goods').field(field).get();

经过测试,不行!!!卧槽,这样查询的话什么字段都没有了。
后来突发奇想,是不是需要加上关联的字段名?

        const field = 'goods_id._id, goods_id.title, goods_id.thumbnail, goods_id.market_price, goods_id.sell_price';  
        const goods_list = await this.dbJQL.collection(free_goods, 'goods').field(field).get();

经过测试,成功了。。。
你大爷的,文档不会给说清楚点啊,让我们瞎猜。
但是!!!上面的问题,字段级权限还是无法绕过,于是,再换一种方式

        const free_goods = await this.dbJQL.collection('free_goods').where(`free_type == ${type} && is_on_sale == true`)  
            .field('goods_id, goods_sku, consume_count').orderBy('_id desc').skip(offset).limit(size).getTemp();  
        console.log(free_goods);  

        const field = '_id, title, thumbnail, market_price, sell_price';  
        const goods = await this.dbJQL.collection('goods').field(field).getTemp();  

        const goods_list = await this.dbJQL.collection(free_goods, goods).get();  
        console.log(goods_list.data);

经过测试,你大爷的,终于绕开字段级权限了,激动的想哭。。。
但是,说真的,这种写法真烂,明明可以少一步的,而且第三段的字段过滤写法也真是没眼看,一般不都是表名.字段名这样吗?
我觉得还是多学习已经非常成熟的数据库吧,看看人家是怎么命名的,我相信这都是经过无数版本升级最终定下来的,肯定比较合理和规范。

2024-03-23 13:00 负责人:无 分享
已邀请:

要回复问题请先登录注册