From bdb94e52e60005ecdac132dc3469fda4483b2255 Mon Sep 17 00:00:00 2001 From: wanganxp Date: Thu, 21 Jul 2022 06:50:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0uni-id-summary=E9=93=BE?= =?UTF-8?q?=E6=8E=A5=E3=80=81opendb=E9=93=BE=E6=8E=A5=E3=80=81=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E5=85=A5=E9=97=A8=E6=95=99=E7=A8=8B=E5=8F=8A?= =?UTF-8?q?=E4=B8=8D=E5=B0=91=E6=96=87=E6=A1=A3=E6=8E=AA=E8=BE=9E=E5=AE=8C?= =?UTF-8?q?=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/uniCloud/README.md | 47 ++--- docs/uniCloud/_sidebar.md | 1 + docs/uniCloud/authentication.md | 2 +- docs/uniCloud/cf-functions.md | 10 +- docs/uniCloud/client-sdk.md | 18 +- docs/uniCloud/cloud-obj.md | 76 ++++--- docs/uniCloud/faq.md | 13 +- docs/uniCloud/hellodb.md | 354 ++++++++++++++++++++------------ docs/uniCloud/http.md | 14 +- docs/uniCloud/jql-cloud.md | 73 +++++-- docs/uniCloud/jql.md | 53 ++--- docs/uniCloud/opendb.md | 2 +- docs/uniCloud/quickstart.md | 57 +---- docs/uniCloud/send-sms.md | 8 +- docs/uniCloud/trigger.md | 4 +- docs/uniCloud/uni-id-pages.md | 2 +- docs/uniCloud/uni-id-summary.md | 80 ++++---- docs/uniCloud/uni-publish.md | 2 +- docs/uniCloud/uni-starter.md | 2 +- docs/uniCloud/unipay.md | 6 +- docs/uniCloud/wx2unicloud.md | 10 +- 21 files changed, 467 insertions(+), 367 deletions(-) diff --git a/docs/uniCloud/README.md b/docs/uniCloud/README.md index 7001e2377..bcef43594 100644 --- a/docs/uniCloud/README.md +++ b/docs/uniCloud/README.md @@ -124,10 +124,10 @@ serverless不是传统云,它不需要开发者选择CPU和内存配置,也 而有了uniCloud,这些门槛全都降了下去: 1. uniCloud采用js编写后端服务代码,无需单独学习php或java,甚至也无需提前掌握nodejs。看下uniCloud的api文档即可。 2. uniCloud基于serverless,开发者无需了解linux、nginx,无需熟悉负载均衡、大并发处理,不用关心系统补丁和DDoS攻击,只需要用js写好云端业务代码,上传到uniCloud即可。 -3. uniCloud推出了[opendb](https://gitee.com/dcloud/opendb),包含了大量的开源数据库模板,常见数据表无需自己设计。通过opendb模板,开发者可以快速掌握数据库设计。 +3. uniCloud推出了[opendb](opendb.md),包含了大量的开源数据库模板,常见数据表无需自己设计。通过opendb模板,开发者可以快速掌握数据库设计。 4. SQL在过去也需要单独学习,尤其是复杂的联表查询、Tree查询,掌握很不容易。uniCloud推出了JQL(Javascript Query Language),会js即可掌握数据库查询,更对联表查询、Tree查询提供了非常简便的操作封装。 -5. uniCloud提供了[uni-id](https://uniapp.dcloud.net.cn/uniCloud/uni-id),无需自己开发账户体系,登录、注册、修改密码、角色权限体系、token管理一应俱全。 -6. uniCloud在[DB Schema](https://uniapp.dcloud.net.cn/uniCloud/schema)中提供了与[uni-id](https://uniapp.dcloud.net.cn/uniCloud/uni-id)的角色权限体系配套的数据权限控制方案。这套方案让初学者也不会在权限控制中犯错。 +5. uniCloud提供了[uni-id](uni-id-summary.md),无需自己开发账户体系,登录、注册、修改密码、角色权限体系、token管理一应俱全。 +6. uniCloud在[DB Schema](schema.md)中提供了与[uni-id](uni-id-summary.md)的角色权限体系配套的数据权限控制方案。这套方案让初学者也不会在权限控制中犯错。 在一目了然的权限配置清单中可以轻松发现漏做的事情,比以往在大坨php代码中分析是否存在权限漏洞要简单的多。 这套方案还能让多人协作、或项目二次开发变的更容易,因为规范的存在,新人可以轻易读懂老代码的权限体系逻辑。 @@ -165,8 +165,8 @@ uni云端一体生态的内容太多,让我们抽丝剥茧、归纳分类, 开发效率提升,分7个层次: 1. 提供众多现成轮子,不用自己写代码 -2. 如果没有现成轮子,那么用[schema2code](https://uniapp.dcloud.net.cn/uniCloud/schema?id=autocode)代码生成工具,生成数据库的增删改查页面(是直接生成页面,不是生成接口) -3. 如果schema2code搞不定,需要手写代码,那么使用[clientDB](https://uniapp.dcloud.net.cn/uniCloud/clientdb),将节省80%的服务端开发工作 +2. 如果没有现成轮子,那么用[schema2code](schema2code.md)代码生成工具,生成数据库的增删改查页面(是直接生成页面,不是生成接口) +3. 如果schema2code搞不定,需要手写代码,那么使用[clientDB](clientdb.md),将节省80%的服务端开发工作 4. 如果仍然需要写云端代码,那么云对象让你的开发更简单 5. HBuilderX在云端协同中提供工具助力 6. 端和云的语言统一,提高了沟通效率、招聘效率 @@ -189,14 +189,14 @@ uni云端一体生态的内容太多,让我们抽丝剥茧、归纳分类, **1. 官方维护的插件** - uni-id:不用再开发用户系统。用户注册、登录(含社交登录、短信验证码登录、App一键登录)、修改或重置密码、token管理、图形验证码、RBAC权限角色系统...所有与用户相关的,不管前端还是云端,代码都是现成的。[详见](/uniCloud/uni-id-summary) -- uni-pay:不管微信还是支付宝,不管App、微信小程序、还是支付宝小程序,不管前端还是服务端,一切都现成的,拿来即用。[详见](/uniCloud/unipay) +- uni-pay:不管微信还是支付宝,不管App、微信小程序、还是支付宝小程序,不管前端还是服务端,一切都现成的,拿来即用。[详见](unipay.md) - uni-starter:云端一体应用快速开发基本项目模版,实现快速搭建一款应用。它集成了很多通用的功能,比如登录注册、头像、设置、拦截器、banner...[详见](https://ext.dcloud.net.cn/plugin?id=5057) -- uni-admin:全端可用的admin后台。自带用户管理、权限管理、角色管理、菜单管理、业务图表统计。更有众多admin插件,比如cms插件、banner管理插件、App升级管理插件...[详见](/uniCloud/admin) +- uni-admin:全端可用的admin后台。自带用户管理、权限管理、角色管理、菜单管理、业务图表统计。更有众多admin插件,比如cms插件、push、banner管理插件、App升级管理插件...[详见](admin.md) - uni-search:云端一体搜索。搜索页面、输入联想、搜索历史记录、热搜词分析提取...一应俱全。[详见](https://ext.dcloud.net.cn/plugin?id=3851) - uni-file-picker:前端直传uniCloud存储组件。[详见](https://ext.dcloud.net.cn/plugin?id=4079) - uni-captcha:云端一体图形验证码组件。[详见](https://ext.dcloud.net.cn/plugin?id=4048) - uni-sec-check:免费的内容安全审查,防止用户提交违法的文字或图片。[详见](https://ext.dcloud.net.cn/plugin?id=5460) -- uni-upgrade-center:App升级中心。支持整包升级、wgt热更新;支持直接下载安装包或跳转应用商店。[详见](uniCloud/upgrade-center.md) +- uni-upgrade-center:App升级中心。支持整包升级、wgt热更新;支持直接下载安装包或跳转应用商店。[详见](upgrade-center.md) **2. 社区的优秀插件** @@ -207,8 +207,6 @@ uni云端一体生态的内容太多,让我们抽丝剥茧、归纳分类, - IM - 日志管理 - 敏感词过滤 -- push -- 图表统计 **3. 项目模板** @@ -226,43 +224,43 @@ uni云端一体生态的内容太多,让我们抽丝剥茧、归纳分类, 在这里,我们还必须提到2个新概念:`uni_module`和`datacom`。 -- uni_module:云端一体组件最佳的承载方式。传统的npm无法处理云端一体的需求,把前端和云端的代码,一起打包到一个uni_module中,整体传播与发布,对云端一体组件的生态有重大的帮助。[详见](https://uniapp.dcloud.net.cn/uni_modules) +- uni_module:云端一体组件最佳的承载方式。传统的npm无法处理云端一体的需求,把前端和云端的代码,一起打包到一个`uni_module`中,整体传播与发布,对云端一体组件的生态有重大的帮助。[详见](https://uniapp.dcloud.net.cn/uni_modules) - datacom:datacom是一种在前端绑定后端数据源的组件。[详见](https://uniapp.dcloud.net.cn/component/datacom) 优良的模块化方案让生态越发繁荣。 #### 第二层提效:schema2code自动生成代码 -如果在第一层提效中,找不到现成的轮子,需要自己写代码时。那么首先要做的,是使用[schema2code](https://uniapp.dcloud.net.cn/uniCloud/schema?id=autocode)这个神器,自动生成代码。 +如果在第一层提效中,找不到现成的轮子,需要自己写代码时。那么首先要做的,是使用[schema2code](schema2code.md)这个神器,自动生成代码。 uniCloud云数据的schema,是一项重要的创新。 -为数据表编写schema,可以实现非常多功能:数据结构定义、权限管理、数据值域管理,以及非常神奇的功能 -- 《[schema2code](https://uniapp.dcloud.net.cn/uniCloud/schema?id=autocode)》 +为数据表编写schema,可以实现非常多功能:数据结构定义、权限管理、数据值域管理,以及非常神奇的功能 -- 《[schema2code](schema2code.md)》 在传统开发中,有了数据库,可以生成crud后台接口。然后前端再写代码调用接口。 但在uni云端一体生态中,有了数据库的schema,可以直接生成云端一体的页面。而不仅仅是只生成接口。 -[schema2code](https://uniapp.dcloud.net.cn/uniCloud/schema?id=autocode),可以生成手机端的列表、详情或增删改页面,也可以生成admin管理端的所有数据管理功能的页面。 +[schema2code](schema2code.md),可以生成手机端的列表、详情或增删改页面,也可以生成admin管理端的所有数据管理功能的页面。 -如下是[schema2code](https://uniapp.dcloud.net.cn/uniCloud/schema?id=autocode)的操作演示视频: +如下是[schema2code](schema2code.md)的操作演示视频: -可以实战体验这个[云端一体通讯录](https://ext.dcloud.net.cn/plugin?id=2574)的项目,几乎没有单独写代码。设计好通讯录的表schema,用[schema2code](https://uniapp.dcloud.net.cn/uniCloud/schema?id=autocode)即可生成这个项目。 +可以实战体验这个[云端一体通讯录](https://ext.dcloud.net.cn/plugin?id=2574)的项目,几乎没有单独写代码。设计好通讯录的表schema,用[schema2code](schema2code.md)即可生成这个项目。 -前述提到的返乡人员管理项目,之所以只花费了半小时就可以做好,也是[schema2code](https://uniapp.dcloud.net.cn/uniCloud/schema?id=autocode)的功劳。 +前述提到的返乡人员管理项目,之所以只花费了半小时就可以做好,也是[schema2code](schema2code.md)的功劳。 数据的权限管理也很简单,在schema中可以快速定义指定的数据记录或字段,只能由什么样角色或权限的人来操作。 数据入库的值域校验就更简单了。传统开发中,一个手机号的校验,需要在前端页面写一遍,服务器入库前再检查一遍,很多余。既然云端协同了,自然会优化掉这个问题。 -现在只需在DB Schema中定义好手机号这个字段的可选值域,比如一个正则,那么[schema2code](https://uniapp.dcloud.net.cn/uniCloud/schema?id=autocode)将自动生成前端表单,且遵循schema的定义,只接受相同正则。 +现在只需在DB Schema中定义好手机号这个字段的可选值域,比如一个正则,那么[schema2code](schema2code.md)将自动生成前端表单,且遵循schema的定义,只接受相同正则。 这样不但提高了开发效率,还可以避免传统开发中各种漏洞,保持严谨和一致性。 -[schema2code](https://uniapp.dcloud.net.cn/uniCloud/schema?id=autocode)生成的代码清晰易读,易于二次开发。这比低代码平台更有效率、且完全开放开源,随意扩展。 +[schema2code](schema2code.md)生成的代码清晰易读,易于二次开发。这比低代码平台更有效率、且完全开放开源,随意扩展。 #### 第三层提效:clientDB,让服务器代码减少80% @@ -289,10 +287,10 @@ uni-app提供了``组件(代码块触发键是udb),在前端 是的,仅需5行代码,就可以完成过去前后端合计得写几十行代码才能完成的事情,代码量大幅减少到原来的十分之一。 -无需担心前端直接访问数据库会造成安全隐患,上一节提过了DB Schema,在云端的schema中可以定义什么角色可以操作数据库。[详见](https://uniapp.dcloud.net.cn/uniCloud/schema?id=permission) +无需担心前端直接访问数据库会造成安全隐患,上一节提过了DB Schema,在云端的schema中可以定义什么角色可以操作数据库。[详见](schema.md#permission) -clientDB技术,有前端的[JS API](https://uniapp.dcloud.net.cn/uniCloud/clientdb)和[前端组件](https://uniapp.dcloud.net.cn/uniCloud/unicloud-db),为了进一步提高开发效率,clientDB还提供了几大利器: -[JQL](https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=jsquery)是一种基于js的数据库操作语言,它改进了SQL语言的诸多不便之处。 +clientDB技术,有前端的[JS API](clientdb.md)和[前端组件](unicloud-db.md),为了进一步提高开发效率,clientDB还提供了几大利器: +[JQL](jql.md)是一种基于js的数据库操作语言,它改进了SQL语言的诸多不便之处。 - 在传统mysql或MongoDB中,联表查询的写法非常麻烦,tree查询mysql根本没有,需要oracle等专业数据库。但在uniCloud中,只需在数据库的schema中定义两个表的字段之间的关系,比如是引用关系(foreignKey)、还是父子关系(parentKey),前端就可以直接查询,轻松完成[联表查询](https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=lookup)和[tree查询](https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=gettree) - SQL语言的运算方法非常少,而JQL则提供了大量的运算方法,比如日期运算dayOfMonth()、字符串操作方法substr()、数字运算方法add()...可以对数据库字段的值直接进行运算和筛选。比如对数据库2个字段进行加权求和然后排序,这传统的SQL语句可搞不定了 @@ -300,9 +298,9 @@ clientDB技术,有前端的[JS API](https://uniapp.dcloud.net.cn/uniCloud/clie #### 第四层提效:云对象,改变前后端协同 -如果clientDB仍然不能满足需求,必须编写云端代码,那么[云对象](uniCloud/cloud-obj.md)的出现,彻底改变了后端开发json接口和前端联调的低效局面。 +如果clientDB仍然不能满足需求,必须编写云端代码,那么[云对象](cloud-obj.md)的出现,彻底改变了后端开发json接口和前端联调的低效局面。 -[云对象](uniCloud/cloud-obj.md)把云端的代码变成对象方式,让前端js直接import这个对象,然后使用这个对象的方法,就像使用前端的js对象一样顺畅。 +[云对象](cloud-obj.md)把云端的代码变成对象方式,让前端js直接import这个对象,然后使用这个对象的方法,就像使用前端的js对象一样顺畅。 云端新加一个`todo`云对象,写一个add方法,代码如下: ```js @@ -381,5 +379,4 @@ js和其他服务器语言,比如php或java,在过去需要Mock来翻译, uniCloud是开发界的革命。在HBuilderX、uni-app、uniCloud三位一体的协同下、创新的功能设计下、丰富的生态和轮子支持下,开发者的开发效率,超过传统开发10倍以上。 - > 目前uniCloud已发展2年多,活跃服务空间数万,云函数日请求数量过亿。请放心使用。 diff --git a/docs/uniCloud/_sidebar.md b/docs/uniCloud/_sidebar.md index f21fa0371..7c61877b3 100644 --- a/docs/uniCloud/_sidebar.md +++ b/docs/uniCloud/_sidebar.md @@ -22,6 +22,7 @@ * [unicloud-db前端组件](uniCloud/unicloud-db.md) * [云函数通过JQL操作数据库](uniCloud/jql-cloud.md) * [JQL调试器](uniCloud/jql-runner.md) + * [schema2code自动生成代码](schema2code.md) * [性能优化](uniCloud/db-performance.md) * [缓存JQL查询到redis](uniCloud/jql-cache-redis.md) * [云函数通过传统方式操作数据库](uniCloud/cf-database.md) diff --git a/docs/uniCloud/authentication.md b/docs/uniCloud/authentication.md index 44020b4b8..fe68d788e 100644 --- a/docs/uniCloud/authentication.md +++ b/docs/uniCloud/authentication.md @@ -8,7 +8,7 @@ 在微信小程序云的开发中,自定义登录还可以用于前端操作数据库。 -但因为腾讯云提供的这套方案不够灵活和完善,uniCloud单独做了[uni-id](/uniCloud/uni-id)用于完善的账户体系,单独做了[clientDB](/uniCloud/clientdb),用于完善快捷的前端操作数据库。 +但因为腾讯云提供的这套方案不够灵活和完善,uniCloud单独做了[uni-id](uni-id-summary.md)用于完善的账户体系,单独做了[clientDB](clientdb.md),用于完善快捷的前端操作数据库。 所以目前腾讯云的自定义登录功能,在uniCloud中的价值只剩下前端删除云存储。DCloud不建议开发者这么用,前端直传云存储不需要腾讯云自定义登录,而删除云存储,还是应该在云端进行。 diff --git a/docs/uniCloud/cf-functions.md b/docs/uniCloud/cf-functions.md index d404e3d55..440f02442 100644 --- a/docs/uniCloud/cf-functions.md +++ b/docs/uniCloud/cf-functions.md @@ -139,15 +139,13 @@ async function sum () { //注意方法或生命周期需使用async异步方式 } ``` -由于篇幅较长,学习云对象需另见文档[云对象](/uniCloud/cloud-obj) +由于篇幅较长,学习云对象需另见文档[云对象](cloud-obj.md) ### 普通云函数callFunction方式 - 普通云函数适用的情况: -云函数是uniCloud的基础,它什么问题都可以解决,但在clientDB和云对象适用的场景中,使用普通云函数反而低效。 - -clientDB和云对象不能解决的包括:需要云函数URL化与非uni-app系统通信、云端定时运行云函数。 +在HBuilderX 3.5.2之前,需要URL化和定时运行时,只能使用普通云函数;在HBuilderX 3.5.2+,云对象也支持了URL化和定时运行,此时推荐使用云对象替代云函数。 **直观体验代码示例** @@ -194,9 +192,9 @@ exports.main = async (event, context) => { --> ### 云函数URL化方式 -云函数URL化,可以让云函数生成一个HTTP URL。在创建了普通云函数后,可以在Web控制台进行URL化配置。它本质上属于普通云函数的一种调用方式。 +可以让云函数/云对象生成一个HTTP URL。可以在Web控制台进行URL化配置。它本质上属于云函数的一种调用方式。 -由于篇幅较长,需另见文档[云函数URL化](/uniCloud/http)。 +由于篇幅较长,需另见文档[云函数URL化](http.md)。 ### uniCloud响应体规范@resformat diff --git a/docs/uniCloud/client-sdk.md b/docs/uniCloud/client-sdk.md index 50164c395..69a8132fb 100644 --- a/docs/uniCloud/client-sdk.md +++ b/docs/uniCloud/client-sdk.md @@ -9,14 +9,14 @@ uniCloud分为客户端和云端两部分,有些接口名称相同,参数也 |API |描述 | |-- |-- | -|uniCloud.importObject() |获取云对象引用以调用云对象接口 [详情](uniCloud/cloud-obj.md) | -|uniCloud.callFunction() |客户端调用云函数 [详情](uniCloud/cf-functions.md?id=clientcallfunction) | -|uniCloud.database() |客户端访问云数据库,获取云数据库对象引用 [详情](uniCloud/clientdb.md) | -|uniCloud.uploadFile() |客户端直接上传文件到云存储 [详情](uniCloud/storage.md?id=uploadfile) | -|uniCloud.getTempFileURL() |客户端获取云存储文件的临时路径 [详情](uniCloud/storage.md?id=gettempfileurl) | -|uniCloud.chooseAndUploadFile() |客户端选择文件并上传 [详情](uniCloud/storage.md?id=chooseanduploadfile) | +|uniCloud.importObject() |获取云对象引用以调用云对象接口 [详情](cloud-obj.md) | +|uniCloud.callFunction() |客户端调用云函数 [详情](cf-functions.md#clientcallfunction) | +|uniCloud.database() |客户端访问云数据库,获取云数据库对象引用 [详情](clientdb.md) | +|uniCloud.uploadFile() |客户端直接上传文件到云存储 [详情](storage.md#uploadfile) | +|uniCloud.getTempFileURL() |客户端获取云存储文件的临时路径 [详情](storage.md#gettempfileurl) | +|uniCloud.chooseAndUploadFile() |客户端选择文件并上传 [详情](storage.md#chooseanduploadfile) | |uniCloud.getCurrentUserInfo() |获取当前用户信息 [详情](#client-getcurrentuserinfo) | -|uniCloud.init() |同时使用多个服务空间时初始化额外服务空间 [详情](uniCloud/init.md) | +|uniCloud.init() |同时使用多个服务空间时初始化额外服务空间 [详情](init.md) | |uniCloud.addInterceptor() |新增拦截器 [详情](#add-interceptor) | |uniCloud.removeInterceptor() |移除拦截器 [详情](#remove-interceptor) | |uniCloud.onResponse() |监听服务端(云函数、云对象、clientDB)响应 [详情](#on-response) | @@ -36,7 +36,7 @@ uniCloud分为客户端和云端两部分,有些接口名称相同,参数也 - 此接口不会发送网络请求,**此接口仅仅是客户端接口,不校验token的合法性以及是否过期** - 需要搭配uni-id使用并要求客户端必须将token存储在storage内的`uni_id_token`内 -- 如需获取role、permission需要将角色权限缓存在token内,此功能自uni-id 3.0.0其默认开启,参考:[缓存角色权限](uniCloud/uni-id.md?id=cache-permission-in-token) +- 如需获取role、permission需要将角色权限缓存在token内,此功能自uni-id 3.0.0 或 uni-id-common中默认开启 用法:`uniCloud.getCurrentUserInfo()` @@ -263,7 +263,7 @@ uniCloud.offResponse(logResponse) > 新增于HBuilderX 3.5.0 -用于监听客户端需要登录事件,此接口需要搭配uniIdRouter使用,参考:[uniIdRouter](uniCloud/uni-id.md?id=uni-id-router) +用于监听客户端需要登录事件,此接口需要搭配uniIdRouter使用,参考:[uniIdRouter](uni-id-summary.md#uni-id-router) 代码示例: diff --git a/docs/uniCloud/cloud-obj.md b/docs/uniCloud/cloud-obj.md index 6b7f1aa30..76287e28a 100644 --- a/docs/uniCloud/cloud-obj.md +++ b/docs/uniCloud/cloud-obj.md @@ -148,7 +148,6 @@ _注:以上例子仅用于方便初学者理解。实际开发中对于简单 4. 客户端调用时在ide里有完善的代码提示,方法参数均可提示。(传输json可没法在ide里提示) 5. 默认支持[uniCloud响应体规范](uniCloud/cf-functions.md?id=resformat),方便错误拦截和统一处理 -注:目前云对象还不支持URL化和定时触发,未来会补充 ## 快速上手 @@ -404,9 +403,13 @@ module.exports = { } ``` -相关文档:[云函数url化的入参](uniCloud/cf-function.md?id=input) +相关文档:[云函数url化的入参](cf-functions.md#input) -## 预处理与后处理@before-and-after +## 内置特殊方法@before-and-after + +注意:所有`_`开头的方法都是私有方法,客户端不可访问。也就是客户端调用云对象时不能调用_开头的方法。 + +目前有3个内置特殊方法:`_before`、`_after`、`_timing` ### 预处理 _before@before @@ -463,7 +466,13 @@ module.exports = { } ``` -注意:所有`_`开头的方法都是私有方法,客户端不可访问。也就是客户端调用云对象时不能调用_开头的方法。 +### 定时运行 _timing + +> 新增于HBuilderX 3.5.2 + +在 uniCloud web控制台可以配置定时任务。给一个云对象配置后,将定时执行该云对象的内置方法 `_after` + +详细用法参考:[云对象使用定时触发](trigger.md#cloudobject) ## 云对象的返回值@return-value @@ -570,13 +579,13 @@ const res = await todo.add('title demo', 'content demo') > 新增于HBuilderX 3.5.2 -详细用法参考:[云对象使用定时触发](uniCloud/trigger.md?id=cloudobject) +详细用法参考:[云对象使用定时触发](trigger.md#cloudobject) ### url化@http-trigger > 新增于HBuilderX 3.5.2 -详细用法参考:[云对象使用url化](uniCloud/http.md?id=cloudobject) +当需要外部系统访问云对象时,可以把云对象封装成一个HTTP的URL。详细用法参考:[云对象使用url化](http.md#cloudobject) ### 跨服务空间调用云对象@call-by-cloud-cross-space @@ -598,6 +607,34 @@ const res = await todo.add('title demo', 'content demo') **注意** - 上述示例代码,在实际开发中均应该使用 try catch 或 then catch 处理错误捕获 +### 云对象方法不能互相调用@call-internal-method + +一个云对象导出的不同方法之间不能互相调用。比如下面示例中 tryAddTodo 方法内部无法调用 addTodo 方法。 + +只能将多个方法共享的逻辑放到云对象导出的对象外部来供云对象的方法调用。例如下面抽离公共函数 pureAddTodo : + +```js +// todo.obj.js +async function pureAddTodo(title, content) { + // ...add todo 逻辑 +} + +module.exports = { + async tryAddTodo() { + try { + return addTodo(title, content) + } catch (e) { + return { + errCode: 'add-todo-failed' + } + } + }, + async addTodo(title, content) { + return pureAddTodo(title, content) + } +} +``` + ### 云对象的接收参数的体积上限 - 阿里云接收参数大小不可超过1MB - 腾讯云接收参数大小不可超过5MB @@ -726,30 +763,3 @@ uniCloud的服务器和客户端交互,有云函数、云对象、clientDB三 如果服务器端不操作数据库外,或者还有复杂的、不宜公开在前端的逻辑,此时推荐使用云对象。 -但云对象仅适用于与uni-app前端交互使用。如果不与uni-app前端交互,比如使用云函数URL化与其他系统通信、或者使用定时云函数,此时不适用云对象,还是需要使用云函数。 - -### 云对象方法互相调用@call-internal-method - -云对象导出的方法之间不能互相调用,如果开发中遇到需要方法间互相调用的场景,请考虑将多个方法共享的逻辑放到云对象导出的对象外部来供云对象的方法调用。例: - -```js -// todo.obj.js -async function pureAddTodo(title, content) { - // ...add todo 逻辑 -} - -module.exports = { - async tryAddTodo() { - try { - return addTodo(title, content) - } catch (e) { - return { - errCode: 'add-todo-failed' - } - } - }, - async addTodo(title, content) { - return pureAddTodo(title, content) - } -} -``` \ No newline at end of file diff --git a/docs/uniCloud/faq.md b/docs/uniCloud/faq.md index 947a88772..dfde51982 100644 --- a/docs/uniCloud/faq.md +++ b/docs/uniCloud/faq.md @@ -7,10 +7,10 @@ 简单来说,uniCloud和微信小程序云开发、支付宝小程序云开发一样稳定健壮,但有更多优势: - 跨平台。不管你在uniCloud里选择了阿里还是腾讯的serverless,均可以跨uni-app的全端使用。从pc到h5,从Android到iOS,以及各家小程序快应用,十几个平台全端支持 - uniCloud提供了`clientDB`神器,减少90%的服务器开发工作量,且保障数据安全。[详见](/uniCloud/database) -- uniCloud提供了[uni-id](/uniCloud/uni-id)、[uniPay](/uniCloud/unipay)等重要框架,大幅减少开发者的相应功能开发量。 +- uniCloud提供了[uni-id](uni-id-summary.md)、[uniPay](/uniCloud/unipay)等重要框架,大幅减少开发者的相应功能开发量。 - uniCloud提供了[uni-starter](https://ext.dcloud.net.cn/plugin?id=5057),客户端开发工作量大幅减少。 - uniCloud提供了[uniCloud admin](/uniCloud/admin),管理端开发工作量大幅减少。 -- uniCloud提供了[schema2code](/uniCloud/schema?id=autocode),只需编制数据库schema文件,用户端和管理端的数据列表、分页、搜索、详情查看、修改、删除,全套代码均能自动生成。 +- uniCloud提供了[schema2code](schema2code.md),只需编制数据库schema文件,用户端和管理端的数据列表、分页、搜索、详情查看、修改、删除,全套代码均能自动生成。 - 更易学。uniCloud提供了`JQL`查询语言,比SQL和MongoDB的查询语法更简单易掌握,尤其是联表查询非常简单。[详见](https://uniapp.dcloud.io/uniCloud/database?id=jsquery) - 更完善的工具链。前端uni-app、云端uniCloud、还有ide端的HBuilderX,互相紧密搭配,打造闭环的优秀开发体验 - 更丰富的生态。插件市场有大量现成的轮子和资源 [详见](https://ext.dcloud.net.cn/?cat1=7&orderBy=TotalDownload) @@ -54,7 +54,7 @@ uniCloud提供了`云函数URL化`,来满足上述需求。[详见](https://un ### 微信云开发支持客户端直接操作数据库,uniCloud支持吗? -uniCloud提供了比微信云开发更优秀的前端操作数据库方案,见:[clientDB](https://uniapp.dcloud.net.cn/uniCloud/database) +uniCloud提供了比微信云开发更优秀的前端操作数据库方案,见:[clientDB](clientdb.md) ### 云开发是nodejs+改良版MongoDB组合,对比php+mysql的传统组合怎么样? @@ -114,7 +114,7 @@ uniCloud在MongoDB的基础上改良,进一步提供了`DB Schema`和`JQL`。 1. 使用clientDB可以减少遇到冷启动问题的概率 2. 非高频访问的云函数,合并到高频云函数中。有的开发者使用纯单页方式编写云函数,即在一个云函数中通过路由处理实现了整个应用的所有后台逻辑。参考[插件](https://ext.dcloud.net.cn/search?q=%E8%B7%AF%E7%94%B1&cat1=7&orderBy=UpdatedDate) 3. 非高频访问的云函数,可以通过定时任务持续运行它(注意腾讯云可以使用这个方式完全避开冷启动,而阿里云的定时任务最短周期大于资源回收周期) -4. 配置云函数的单实例多并发,请参考:[单实例多并发](uniCloud/cf-functions.md?id=concurrency) +4. 配置云函数的单实例多并发,请参考:[单实例多并发](cf-functions.md#concurrency) ### uniCloud访问速度感觉不如传统服务器?@slow 有开发者在一台单机上安装php或java,连接同电脑的mysql。然后与uniCloud比较速度,认为uniCloud偏慢。这里需要澄清如下差异: @@ -195,9 +195,8 @@ uniCloud.httpclient.request('https://example.com',{ 2. 使用[uni-cloud-router单路由云函数框架](https://uniapp.dcloud.net.cn/uniCloud/uni-cloud-router),这种方式只有一个云函数,所有接口都是这个云函数的不同参数,它有统一的路由管理。 以免费空间的48个云函数举例,一般情况下: -- 后台管理系统使用[uniCloud admin](https://uniapp.dcloud.net.cn/uniCloud/admin),会自带一个uni-admin的云函数; -- 前端项目,会有一个[uni-id](https://uniapp.dcloud.net.cn/uniCloud/uni-id)配套的user-center云函数。如果和uniCloud admin复用一个服务空间,此云函数也不需要; -- 如果有热搜词统计跑批,[uni-search](https://ext.dcloud.net.cn/plugin?id=3851)配套一个云函数uni-analyse-searchhot; +- [uni-id](uni-id-summary.md)会有一个云对象(uni-id-co)或老版的云函数(uni-id-cf),这是必备的一个云函数 +- 如果使用uni统计、app升级中心、uni发布平台、uniPush2、[uni-search热搜词统计跑批](https://ext.dcloud.net.cn/plugin?id=3851),这些会自带云函数 上述几个是官方推荐的几个常用框架所带的云函数,然后开发者自己的代码里,大多数业务使用clientDB开发,不写云函数,或者写了配套的action云函数也不占用云函数数量;如果还需要自己写一些云函数,再加上uni-cloud-router,用这个单路由云函数搞定剩余需求;另外如果有跑批数据的需求可以再来一个云函数。所以无论如何48个云函数都占不满。 diff --git a/docs/uniCloud/hellodb.md b/docs/uniCloud/hellodb.md index 96a33206d..0b0354533 100644 --- a/docs/uniCloud/hellodb.md +++ b/docs/uniCloud/hellodb.md @@ -2,19 +2,22 @@ `uniCloud`提供了一个 JSON 格式的文档型数据库。顾名思义,数据库中的每条记录都是一个 JSON 格式的文档。 -它是nosql非关系型数据库,如果您之前熟悉sql关系型数据库,那么两者概念对应关系如下表: +它是 nosql 非关系型数据库,如果您之前熟悉 sql 关系型数据库,那么两者概念对应关系如下表: |关系型 |JSON 文档型 | |:- |:- | |数据库 database|数据库 database | |表 table |集合 collection。但行业里也经常称之为“表”。无需特意区分 | |行 row |记录 record / doc | -|字段 column |字段 field | -|使用sql语法操作|使用MongoDB语法或jql操作 | +|字段 column / field |字段 field | +|使用sql语法操作|使用MongoDB语法或jql语法操作 | -一个`uniCloud`服务空间,有且只有一个数据库。一个数据库支持多个集合(表)。一个集合可以有多个记录。每个记录可以有多个字段。 +- 一个`uniCloud`服务空间,有且只有一个数据库; +- 一个数据库可以有多个表; +- 一个表可以有多个记录; +- 一个个记录可以有多个字段。 -例如,数据库中有一个集合,名为user,存放用户信息。集合user的数据内容如下: +例如,数据库中有一个表,名为user,存放用户信息。表user的数据内容如下: ```json {"name":"张三","tel":"13900000000"} @@ -23,11 +26,11 @@ 上述数据中,每行数据表示一个用户的信息,被称之为“记录(record/doc)”。name和tel称之为“字段(field)”。而“13900000000”则是第一条记录的字段tel的值。 -每行记录,都是一个完整的json文档,获取到记录后可以使用常规json方式操作。但集合并非json文档,集合是多个json文档的汇总,获取集合需要使用专门的API。 +每行记录,都是一个完整的json文档,获取到记录后可以使用常规json方式操作。但表并非json文档,表是多个json文档的汇总,获取表需要使用专门的API。 与关系型数据库的二维表格式不同,json文档数据库支持不同记录拥有不同的字段、支持多层嵌套数据。 -仍然以user集合举例,要在数据库中存储每个人的每次登录时间和登录ip,则变成如下: +仍然以user表举例,要在数据库中存储每个人的每次登录时间和登录ip,则变成如下: ```json { @@ -44,9 +47,9 @@ 可以看出json文档数据库相对于关系型数据库的灵活,李四可以没有login_log字段,也可以有这个字段但登录次数记录与张三不同。 -_此处仅为举例,实际业务中,登录日志单独存放在另一个集合更好_ +_此处仅为举例,实际业务中,登录日志单独存放在另一个表更合适_ -对于初学者,如果不了解数据库设计,可以参考[opendb](https://gitee.com/dcloud/opendb),已经预置了大量常见的数据库设计。 +对于初学者,如果不了解数据库设计,可以参考[opendb](opendb.md),已经预置了大量常见的数据库设计。 对于不熟悉传统数据库,但掌握json的js工程师而言,uniCloud的云数据库更亲切,没有传统数据库高昂的学习成本。 @@ -54,63 +57,186 @@ _此处仅为举例,实际业务中,登录日志单独存放在另一个集 uniCloud同时支持阿里云和腾讯云,它们的数据库大体相同,有细微差异。阿里云的数据库是mongoDB4.0,腾讯云则使用自研的文档型数据库(兼容mongoDB 4.0版本)。uniCloud基本抹平了不同云厂商的差异,有差异的部分会在文档中单独标注。 -如果想在云函数连接其他数据库,如mysql,用法和nodejs连接这些数据库是一样的。插件市场已经有人提供了插件,见下。但注意这些用法推荐用于数据导入,主业务开发不建议这么使用。因为其他服务器上的数据库和云函数环境物理上不在一起,连接会比较慢。 +## 创建第一个表 -- [云函数连接Mysql数据库示例](https://ext.dcloud.net.cn/plugin?id=1925) +1. 打开 uniCloud web控制台 [https://unicloud.dcloud.net.cn/](https://unicloud.dcloud.net.cn/) -如需使用redis,请参考文档:[Redis扩展库](uniCloud/redis.md) +2. 创建或进入一个已存在的服务空间,选择 云数据库->云数据库,创建一个新表 -## 操作数据库的方式@db-operation-type +比如我们创建一个简历表,名为 `resume`。点击上方右侧的 创建 按钮即可。 -云数据库支持通过云函数访问,也支持在客户端访问云数据库。 +![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/e8ca747e-d39f-4da2-8a82-733f9d486cb0.jpg) -- 传统方式云函数操作数据库,使用nodejs写云函数、使用传统的MongoDB的API操作云数据库。 -- 客户端访问云数据库,称为[clientDB](uniCloud/clientdb.md)。这种开发方式可大幅提升开发效率,避免开发者开发服务器代码,并且支持更易用的`jql`语法操作数据库,是更为推荐的开发方式。[clientDB](uniCloud/clientdb.md)有单独一套权限和字段值控制系统,无需担心数据库安全。需要`HBuilderX 2.9.5`及以上版本 -- 云函数内使用jql语法操作数据库,需要使用[jql扩展库](uniCloud/jql-cloud.md)。与clientDB写法一致,仅在访问password类型的数据时有区别。clientDB完全不可访问password类型字段(即使为此字段设置permission也不生效)。云函数内password类型字段默认权限为false(可以被admin用户访问),开发者配置的字段权限会覆盖此默认权限。需要`HBuilderX 3.3.1`及以上版本 +新建表时,支持选择现成的 [opendb](opendb.md) 表模板,选择一个或多个模板表,可以点击右下方按钮创建。 + +创建表一共有3种方式: +1. 在web控制台创建 +2. 在HBuilderX中,项目根目录/uniCloud/database点右键新建schema,上传时创建 +3. 在代码中也可以创建表,但不推荐使用,[见下](?id=createCollection) + +## 数据表的3个组成部分 + +每个数据表,包含3个部分: +- data:数据内容 +- index:索引 +- schema:数据表格式定义 + +在uniCloud的web控制台可以看到一个数据表的3部分内容。 + +### 数据内容@dbdata + +data,就是存放的数据记录(record)。里面是一条一条的json文档。 + +record可以增删改查、排序统计。后续有API介绍。 + +可以先在 web控制台 为之前的 `resume` 表创建一条记录。 + +输入一个json +```json +{ + "name": "张三", + "birth_year": 2000, + "tel": "13900000000", + "email": "zhangsan@zhangsan.com", + "intro": "擅于学习,做事严谨" +} +``` + +![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/cf0ffb14-c81d-486f-a687-55f84bc99969.jpg) + +创建一条新记录,是不管在web控制台创建,还是通过API创建,每条记录都会自带一个`_id`字段用以作为该记录的唯一标志。 + +`_id`字段是每个数据表默认自带且不可删除的字段。同时,它也是数据表的索引。 + +![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/7ed5185c-cfcd-461b-a178-5516e9937798.jpg) + +阿里云使用的是标准的mongoDB,`_id`是自增的,后创建的记录的`_id`总是大于先生成的`_id`。传统数据库的自然数自增字段在多物理机的大型数据库下很难保持同步,大型数据库均使用`_id`这种长度较长、不会重复且仍然保持自增规律的方式。 + +**腾讯云使用的是兼容mongoDB的自研数据库,`_id`并非自增** + +插入/导入数据时也可以自行指定`_id`而不使用自动生成的`_id`,这样可以很方便的将其他数据库的数据迁移到uniCloud云数据库。 + +### 数据库索引@dbindex + +所谓索引,是指在数据表的众多字段中挑选一个或多个字段,让数据库引擎优先处理这些字段。 + +设置为索引的字段,在通过该字段查询(where)或排序(orderBy)时可以获得更快的查询速度。 + +但设置过多索引也不合适,会造成数据新增和删除变慢。 + +新建的表,默认只有一个索引`_id`。 + +一个数据表可以有多个字段被设为索引。 + +索引分唯一型和非唯一型。 + +唯一型索引要求整个数据表多个记录的该字段的值不能重复。比如`_id`就是唯一型索引。 + +假使有2个人都叫“张三”,那么他们在user数据表里的区分就是依靠不同的`_id`来区分。 + +如果我们要根据name字段来查询,为了提升查询速度,此时可以把name字段设为非唯一索引。 + +索引内容较多,还有“组合索引”、“稀疏索引”、“地理位置索引”、“TTL索引”等概念。有单独的文档详细讲述索引,另见:[数据库索引](uniCloud/db-index.md) + + +**在web控制台添加上述索引** + +![](https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-dc-site/fca53140-1d91-11eb-880a-0db19f4f74bb.jpg) + +**注意** +- 如果记录中已经存在多个记录某字段相同的情况,那么将该字段设为唯一型索引会失败。 +- 如果已经设置某字段为唯一索引,在新增和修改记录时如果该字段的值之前在其他记录已存在,会失败。 +- 假如记录中不存在某个字段,则对索引字段来说其值默认为 null,如果该索引字段设为唯一型索引,则不允许存在两个或以上的该字段为null或不存在该字段的记录。此时需要设置稀疏索引来解决多个null重复的问题 + + +### 数据表格式定义@dbschema + +`DB Schema`是表结构描述。描述数据表有哪些字段、值域类型是什么、是否必填、数据操作权限等很多内容。 + +因为 MongoDB 的灵活性,理论上`DB Schema`不是必须的,使用传统 MongoDB API 操作数据库不需要`DB Schema`。 + +但如果使用 JQL,那`DB Schema`就是必须的。 + +`DB Schema`涉及内容较多,另见文档:[https://uniapp.dcloud.io/uniCloud/schema](uniCloud/schema) + + +## API操作数据库的方式@db-operation-type + +uniCloud 的云数据库有多种操作方式。 +- 支持在云函数操作,也支持在客户端操作。 +- 支持使用传统MongoDB语法操作,也支持JQL语法操作。 + +uniCloud 默认推荐使用 JQL 语法操作数据库,它是一种更简单易用、对js开发者更友好的、开发效率更高的数据库操作语法。[详见](jql.md) + +不管在云函数中还是在uni-app客户端中,均支持JQL。 + +同时 uniCloud 保留了在云函数中使用传统 MongoDB 的 nodejs API 操作云数据库。 + +| |运行在云端 |运行在客户端 |支持 DB Schema | +|-- |-- |-- |-- | +|JQL云函数 |√ |√ |√ | +|传统MongoDB客户端 |√ |X |X | + +关于几种操作数据库方式的选择: +1. 优先使用客户端操作数据库(称为[clientDB](uniCloud/clientdb.md)) + + 传统开发中,其实大多数服务器接口开发,就是检验下前端数据和身份的合法性,然后写个SQL操作下数据库,返回JSON给前端。其实很无聊。 + + clientDB最大的好处就是不用写服务端代码,客户端直接操作数据库。因为uniCloud提供了[DB Schema](schema.md)和[uni-id](uni-id-summary.md),可以直接控制数据库的内容和权限校验。 + + clientDB同时支持`action云函数`作为补充,当发起一个客户端操作云数据库的请求时,可以同时触发一个`action云函数`,在云端对数据库操作进行前置或后置处理。 + + 如下场景不适用clientDB: + - 相关数据库操作逻辑不适合暴露在前端,比如抽奖 + - 注册、修改密码等操作password类型数据(password类型不会传给前端)的情况。一般情况下开发者不涉及相关问题。因为注册、修改密码等账户管理相关,官方已提供了[uni-id-pages](uni-id-pages.md),里面有uni-id-co云对象。所以开发者无需自己编写相关逻辑,直接用这个插件就好了。 + - 三方服务器回调。在登录、支付等涉及隐私的地方较常见。比如从微信服务器获取用户手机号,只支持云端获取,获取后要入库保存 + +2. 其次使用云函数的JQL扩展库来操作数据库 + + 对于clientDB不适应的场景,推荐在云函数或云对象中使用JQL。 + + 目前云函数中JQL不适用的场景:使用 set 操作符动态修改字段名称(不是字段值)。这个场景常规业务不涉及,未来JQL可能会完善并支持这个场景。 + +3. 除非开发者原本就对 nodejs 操作 MongoDB 非常熟悉,且需要使用 set 操作符动态修改字段名等,否则不推荐使用传统MongoDB写法。 + + MongoDB API操作数据库,不能在客户端操作、不支持 DB Schema,不支持HBuilderX的jql查询器,不能在客户端的代码提示中提示数据库的表名、字段。 不管使用哪种方法,都有很多公共的概念或功能。本文档将讲述这些公共的内容。 同时左侧导航有三种方法的专项链接,描述它们各自特有的功能。 -- [云函数使用传统MongoDB语法操作数据库](uniCloud/cf-database.md) -- [前端操作数据库clientDB](uniCloud/clientdb.md) -- [云函数内使用JQL语法操作数据库](uniCloud/jql-cloud.md) +- [客户端操作数据库clientDB](clientdb.md) +- [云函数内使用JQL语法操作数据库](jql-cloud.md) +- [云函数使用传统MongoDB语法操作数据库](cf-database.md) -## 获取数据库对象@database +## 获取数据库对象的API@database 想要通过代码操作数据库,第一步要获取服务空间里的数据库对象。 -**云函数使用传统MongoDB语法操作数据库以及客户端使用clientDB获取数据库实例:** - ```js const db = uniCloud.database(); //代码块为cdb ``` js中敲下代码块`cdb`,即可快速输入上述代码。 -**云函数内使用JQL扩展库时获取数据库实例写法为:** +其中,云函数内使用JQL扩展库时,还需要做一个工作,就是指定操作用户身份。[详见](jql-cloud.md?id=use-in-object) ```js -// 简单的使用示例 +// 云函数中JQL使用示例 'use strict'; exports.main = async (event, context) => { const dbJQL = uniCloud.databaseForJQL({ // 获取JQL database引用,此处需要传入云函数的event和context,必传 event, context }) - const bookQueryRes = dbJQL.collection('book').where("name=='三国演义'").get() // 直接执行数据库操作 return { - bookQueryRes + dbJQL.collection('book').get() // 直接执行数据库操作 } }; ``` -## 获取其他服务空间数据库实例@init-db - -如果当前应用仅使用一个服务空间,在HBuilderX中做好服务空间关联即可。获取当前空间的数据库实例时无需传递配置,直接调用database方法即可 +### 获取其他服务空间数据库实例@init-db -```js -const db = uniCloud.database() -``` +如果当前应用仅使用一个服务空间,在HBuilderX中做好服务空间关联即可。获取当前空间的数据库实例时无需传递配置,直接调用database方法默认就是操作关联服务空间的数据库。 如果应用有连接其他服务空间数据库的需求,可以在获取database实例时传递对应服务空间的配置 @@ -141,15 +267,9 @@ db.collection('uni-id-users').get() |provider |String |是 |- |aliyun、tencent | |spaceId |String |是 |- |服务空间ID,**注意是服务空间ID,不是服务空间名称** | |clientSecret |String |是 |- |仅阿里云支持,可以在[uniCloud控制台](https://unicloud.dcloud.net.cn)服务空间列表中查看 | -|endpoint |String |否 |`https://api.bspapp.com` |服务空间地址,仅阿里云侧支持 | +|endpoint |String |否 |`https://api.bspapp.com` |服务空间地址,仅阿里云支持 | -## 创建一个集合/数据表@createCollection - -新建的服务空间,没有数据表。需要首先创建集合/数据表。 - -可以在uniCloud的web控制台([https://unicloud.dcloud.net.cn](https://unicloud.dcloud.net.cn))在web页面创建数据表,也可以通过代码创建数据表。 - -通过代码创建数据表的方式,阿里云和腾讯云有差别: +## 创建集合/表的API@createCollection - 阿里云 @@ -174,7 +294,7 @@ db.createCollection("table1") - 如果数据表已存在,腾讯云调用createCollection方法会报错 - 腾讯云调用collection的add方法不会自动创建数据表,不存在的数据表会报错 - 阿里云没有createCollection方法 -- 使用代码方式创建的表没有索引,请谨慎使用此方式 +- **使用代码方式创建的表没有索引、schema,性能和功能都受影响,不建议使用这种方式** ## 获取集合/数据表对象@collection @@ -183,7 +303,7 @@ db.createCollection("table1") ```js const db = uniCloud.database(); // 获取名为 `table1` 数据表的引用 -const collection = db.collection('table1'); +const resume = db.collection('resume'); ``` **集合/数据表 Collection 的方法** @@ -204,29 +324,68 @@ const collection = db.collection('table1'); collection对象的方法可以增和查数据,删和改不能直接操作,需要collection对象通过doc或get得到指定的记录后再调用remove或update方法进行删改。 -具体前端clientDB和云函数各自增删改查的方法,请单独参考文档: -- [云函数使用传统MongoDB语法操作数据库](uniCloud/cf-database) -- [前端操作数据库,clientDB和jql](uniCloud/clientdb) +数据操作的API较多,请单独参考文档: +- [JQL语法操作数据库](jql.md) +- [MongoDB语法操作数据库](cf-database.md) -## 数据类型@data-type +**示例** + +这里我们使用clientDB,实现一个简单的在前端获取刚才输入 resume 表的记录的功能。 +1. 创建一个uni-app项目,开通uniCloud环境,并在uniCloud初始化向导中关联 resume表所在的服务空间;或者使用老项目对uniCloud目录点右键关联服务空间。 +2. 对项目下的 uniCloud/database 点右键,下载所有DB Schema。 +3. 打开新下载的 resume.schema.json ,将其中的 "permission" 节点下的 "read" 从 false 改为 true。即设置该表允许任意用户读 (后续可以深入学习 DB Schema) +4. 在客户端 pages/index/index.vue 编写代码 +```html + + +``` +5. 运行项目,点击按钮,即打印出查询到的数据库内容 + `res.result.data`下即为数据表 resume 中的数据。 -数据库内数据基础类型有以下几种: +## 数据类型@data-type -* String:字符串 -* Number:数字 -* Object:对象 -* Array:数组 -* Bool:布尔值 +数据库内数据类型有以下几种: + +* string:字符串 + + password:[DB Schema]中扩展的特殊string。用于保存密码。这类字段不会通过clientDB传递给前端,所有用户都不能通过clientDB读写,即使是admin管理员 +* number:数字 + + 在[DB Schema]中细化为int和double +* bool:布尔值 +* date:时间 +* timestamp 时间戳 +* object:对象 + + file:[DB Schema]中扩展的特殊 object,用于云存储文件的信息体。不直接存储文件,而是一个json object,包括云存储文件的名称、路径、文件体积等信息。(HBuilderX 3.1.0+ ) +* array:数组 +* null:相当于一个占位符,表示一个字段存在但是值为空。 * GeoPoint:地理位置点 * GeoLineStringLine: 地理路径 * GeoPolygon: 地理多边形 * GeoMultiPoint: 多个地理位置点 * GeoMultiLineString: 多个地理路径 * GeoMultiPolygon: 多个地理多边形 -* Date:时间 -* Null:相当于一个占位符,表示一个字段存在但是值为空。 -DB Schema中还扩展了其他字段类型,但其实都是基本类型的扩展,比如file类型其实是一种特殊的object,而password类型是一种特殊的string类型。 +DB Schema的数据类型有专门文档,[详见](schema.md?id=bsontype) ### Date类型 @@ -343,73 +502,14 @@ new db.Geo.MultiPolygon([ ]) ``` -## 集合/数据表的3个组成部分 - -每个数据表,其实包含3个部分: -- data:数据内容 -- index:索引 -- schema:数据表格式定义 - -在uniCloud的web控制台可以看到一个数据表的3部分内容。 - -### 数据内容@dbdata - -data很简单,就是存放的数据记录(record)。 - -实际上,创建一条新记录,是不管在web控制台创建,还是通过API创建,每条记录都会自带一个`_id`字段用以作为该记录的唯一标志。 - -`_id`字段是每个数据表默认自带且不可删除的字段。同时,它也是数据表的索引。 - -阿里云使用的是标准的mongoDB,`_id`是自增的,后创建的记录的`_id`总是大于先生成的`_id`。传统数据库的自然数自增字段在多物理机的大型数据库下很难保持同步,大型数据库均使用`_id`这种长度较长、不会重复且仍然保持自增规律的方式。 - -**腾讯云使用的是兼容mongoDB的自研数据库,`_id`并非自增** - -插入/导入数据时也可以自行指定`_id`而不使用自动生成的`_id`,这样可以很方便的将其他数据库的数据迁移到uniCloud云数据库 - -### 数据库索引@dbindex - -所谓索引,是指在数据表的众多字段中挑选一个或多个字段,让数据库引擎优先处理这些字段。设置为索引的字段,在通过该字段查询记录时可以获得更快的查询速度。但设置过多索引也不合适,会造成数据新增和删除变慢。 - -一个数据表可以有多个字段被设为索引。 - -索引分唯一型和非唯一型。 - -唯一型索引要求整个数据表多个记录的该字段的值不能重复。比如`_id`就是唯一型索引。 - -假使有2个人都叫“张三”,那么他们在user数据表里的区分就是依靠不同的`_id`来区分。 - -如果我们要根据name字段来查询,为了提升查询速度,此时可以把name字段设为非唯一索引。 - -索引内容较多,还有“组合索引”、“稀疏索引”、“地理位置索引”、“TTL索引”等概念。有单独的文档详细讲述索引,另见:[数据库索引](uniCloud/db-index.md) - - -**在web控制台添加上述索引** - -![](https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-dc-site/fca53140-1d91-11eb-880a-0db19f4f74bb.jpg) - -**注意** -- 如果记录中已经存在多个记录某字段相同的情况,那么将该字段设为唯一型索引会失败。 -- 如果已经设置某字段为唯一索引,在新增和修改记录时如果该字段的值之前在其他记录已存在,会失败。 -- 假如记录中不存在某个字段,则对索引字段来说其值默认为 null,如果该索引字段设为唯一型索引,则不允许存在两个或以上的该字段为null或不存在该字段的记录。此时需要设置稀疏索引来解决多个null重复的问题 - - -### 数据表格式定义@dbschema - -`DB Schema`是集合的表结构描述。描述数据表有哪些字段、值域类型是什么、是否必填、数据操作权限等很多内容。 - -因为json文档数据库的灵活性,data数据的字段可以不在schema的描述范围内。 - -`DB Schema`更多是为搭配jql语法使用的,如果使用jql语法(clientDB或者使用了jql扩展库的云函数内)则需要详细阅读`DB Schema`的文档。 - -`DB Schema`涉及内容较多,另见文档:[https://uniapp.dcloud.io/uniCloud/schema](uniCloud/schema) ## 与传统开发区别@difference -不同于传统开发,云函数连接数据库有单次操作时长限制,目前单次操作时间限制如下。超出此时间会报超时错误。一般情况下在设置了合适的索引时不会遇到超时错误,如何优化查询速度请参考:[数据库性能优化](uniCloud/db-performance.md) +不同于传统开发,连接数据库有单次操作时长限制,目前单次操作时间限制如下。超出此时间会报超时错误。一般情况下在设置了合适的索引时不会遇到超时错误,如何优化查询速度请参考:[数据库性能优化](uniCloud/db-performance.md) |腾讯云 |阿里云 | |-- |-- | -|5秒 |1秒 | +|5秒 |3秒 | ## 数据导入导出和备份@dbmigration @@ -495,7 +595,7 @@ uniCloud数据库提供了多种数据导入导出和备份方案。 在HBuilderX中对上述`db_init.json`点右键,可初始化数据库到云服务空间,创建`collection_test`表,并按上述json配置设置该表的index索引和schema,以及插入data下的数据。 -[opendb](https://gitee.com/dcloud/opendb)的表,在`db_init.json`中初始化时,不建议自定义index和schema。系统会自动从opendb规范中读取最新的index和schema。 +[opendb](opendb.md)的表,在`db_init.json`中初始化时,不建议自定义index和schema。系统会自动从opendb规范中读取最新的index和schema。 **使用`db_init.json`导入数据库** @@ -533,19 +633,19 @@ uniCloud会在每天凌晨自动备份一次数据库,最多保留7天。这 1. 登录[uniCloud后台](https://unicloud-dev.dcloud.net.cn/) 2. 点击左侧菜单`云数据库 --> 数据库回档`,点击`新建回档` 3. 选择可回档时间 -4. 选择需要回档的集合(注意:回档后集合不能与现有集合重名,如需对集合重命名可以在集合列表处操作) +4. 选择需要回档的表(注意:回档后表不能与现有表重名,如需对表重命名可以在表列表处操作) ![数据库回档](https://img.cdn.aliyun.dcloud.net.cn/uni-app/uniCloud/unicloud-db-backup.jpg) ### 数据导出为文件@export -此功能主要用于导出整个集合的数据 +此功能主要用于导出整个表的数据 **用法** 1. 进入[uniCloud web控制台](https://unicloud.dcloud.net.cn/home),选择服务空间,或者直接在HBuilderX云函数目录`cloudfunctions`上右键打开uniCloud web控制台 -2. 进入云数据库选择希望导入数据的集合 +2. 进入云数据库选择希望导入数据的表 3. 点击导出按钮 4. 选择导出格式,如果选择csv格式还需要选择导出字段 5. 点击确定按钮等待下载开始即可 @@ -564,7 +664,7 @@ uniCloud提供的`db_init.json`主要是为了对数据库进行初始化,并 **用法** 1. 进入[uniCloud web控制台](https://unicloud.dcloud.net.cn/home),选择服务空间,或者直接在HBuilderX云函数目录`cloudfunctions`上右键打开uniCloud web控制台 -2. 进入云数据库选择希望导入数据的集合 +2. 进入云数据库选择希望导入数据的表 3. 点击导入,选择json文件或csv文件 4. 选择处理冲突模式(关于处理冲突模式请看下方注意事项) 5. 点击确定按钮等待导入完成即可 @@ -581,7 +681,7 @@ uniCloud提供的`db_init.json`主要是为了对数据库进行初始化,并 {"a":2} ``` -> 如果是自己拼接的json格式数据请注意:如果存在集合A关联集合B的字段的场景需要保证关联字段在A、B内是一致的(特别需要注意的是各种与_id关联的字段) +> 如果是自己拼接的json格式数据请注意:如果存在表A关联表B的字段的场景需要保证关联字段在A、B内是一致的(特别需要注意的是各种与_id关联的字段) 例: @@ -589,13 +689,13 @@ uniCloud提供的`db_init.json`主要是为了对数据库进行初始化,并 ```js // 这里为了方便看数据进行了格式化,实际导入所需的json文件是每行一条记录 -// article集合 +// article表 { "user_id": { $oid: "601cf1dbf194b200018ed8ec" } } -// user集合 +// user表 { "_id": { $oid: "601cf1dbf194b200018ed8ec" @@ -607,11 +707,11 @@ uniCloud提供的`db_init.json`主要是为了对数据库进行初始化,并 ```js // 这里为了方便看数据进行了格式化,实际导入所需的json文件是每行一条记录 -// article集合 +// article表 { "user_id": "601cf1dbf194b200018ed8ec" } -// user集合 +// user表 { "_id": { $oid: "601cf1dbf194b200018ed8ec" diff --git a/docs/uniCloud/http.md b/docs/uniCloud/http.md index c24059294..9b1c96900 100644 --- a/docs/uniCloud/http.md +++ b/docs/uniCloud/http.md @@ -1,15 +1,17 @@ -## 操作场景 +## 使用场景 -云函数URL化 是 uniCloud 为开发者提供的 HTTP 访问服务,让开发者可以通过 HTTP URL 方式访问到云函数。 +云函数/云对象URL化 是 uniCloud 为开发者提供的 HTTP 访问服务,让开发者可以通过 HTTP URL 方式访问到云函数或云对象。 - 场景1:比如App端微信支付,需要配服务器回调地址,此时需要一个HTTP URL。 -- 场景2:非uni-app开发的系统,想要连接uniCloud,读取数据,也需要通过HTTP URL方式访问。 +- 场景2:非uni-app开发的系统,想要连接uniCloud,读写数据,也需要通过HTTP URL方式访问。 url化后需要注意以下几点 - 安全:为了保障业务安全性,开发者需在代码中做好权限控制和安全防护,避免未授权访问触发敏感操作。 - 计费:云函数开启了URL化后,如果遇到大量恶意访问,消耗云函数资源,开发者可以将云函数访问地址设置为空即可停止 HTTP 访问支持。 +> 云函数自上线就支持URL化。云对象的URL化需HBuilderX 3.5.2+。下文除非特别提到云对象,否则云函数通指普通云函数和云对象。 + 本文档主要指导您如何在uniCloud web控制台管理和使用云函数URL化。 **使用限制** @@ -20,7 +22,7 @@ url化后需要注意以下几点 ### 设置云函数 HTTP 访问地址@set-path -1. 登录[uniCloud后台](https://unicloud.dcloud.net.cn/),选择需要管理的服务空间。 +1. 登录[uniCloud后台](https://unicloud.dcloud.net.cn/),选择服务空间。 2. 单击左侧菜单栏【云函数】,进入云函数页面。 3. 点击需要配置的云函数的【详情】按钮,配置访问路径。 @@ -370,11 +372,11 @@ module.exports = { } ``` -如果通过`https://xxx.com/todo/addTodo?title=todo-title&content=todo-content`调用云对象,怎todo方法内的console.log会输出以下内容`{title: 'todo-title', content: 'todo-content'}` +如果通过`https://xxx.com/todo/addTodo?title=todo-title&content=todo-content`调用云对象,todo方法内的console.log会输出以下内容`{title: 'todo-title', content: 'todo-content'}` 需要注意的是自url内解析出的参数均为字符串类型。 **注意** - url化方式调用云对象时,`_before`和`_after`均正常执行 -- 如果需要获取其他方式传入云对象的参数(如:post一个json内容到云对象),请使用[this.getHttpInfo](uniCloud/cloud-obj.md?id=get-http-info)获取 \ No newline at end of file +- 如果需要获取其他方式传入云对象的参数(如:post一个json内容到云对象),请使用[this.getHttpInfo](cloud-obj.md#get-http-info)获取 \ No newline at end of file diff --git a/docs/uniCloud/jql-cloud.md b/docs/uniCloud/jql-cloud.md index 7828571cb..38d21d7c1 100644 --- a/docs/uniCloud/jql-cloud.md +++ b/docs/uniCloud/jql-cloud.md @@ -2,13 +2,22 @@ > 新增于HBuilderX 3.3.1版本 -HBuilderX 3.3.1之前JQL只能在clientDB及JQL数据库管理里面使用,此次更新为云函数带来了JQL语法,云函数内也可以享受便捷的数据库操作语句编写。 +对于不适合在前端暴露的数据库操作,过去只能在云函数中使用传统MongoDB语法。此次更新让云函数也可以使用 JQL 来操作数据库。 -关于JQL语法及其他注意事项请参考此文档:[JQL数据库操作](uniCloud/jql.md) +相比于传统 MongoDB语法,JQL 为云函数带来如下价值: -## 为云函数启用jql扩展库@use-in-function +1. JQL 优化了联表查询、Tree查询、虚拟表查询等,比 MongoDB语法更易用 +2. 支持 DB Schema,包括各种值域约束和权限校验。无需再开发接口的权限和数据合法性验证代码 -需要开发者手动在云函数的package.json内添加云函数的扩展库。(如果云函数目录下没有package.json,可以通过在云函数目录下执行`npm init -y`来生成) +本文主要讲解云函数中如何使用 JQL 。详细的 JQL 语法另见文档:[JQL数据库操作](uniCloud/jql.md) + +## 为云函数添加jql扩展库 + +JQL 操作的引擎代码体积不小,考虑到有的云函数并不操作数据库或不使用JQL,所以相关功能被剥离在`uni-cloud-jql`扩展库中。 + +HBuilderX 3.4起,新建云函数/云对象,**默认加载**`uni-cloud-jql`扩展库。对于老云函数,也可以对云函数点右键 -> 管理公共模块或扩展库依赖 -> 选择`uni-cloud-jql` + +HBuilderX 3.4以前的开发者,需要在云函数的package.json内手动添加扩展库。(如果云函数目录下没有package.json,可以通过在云函数目录下执行`npm init -y`来生成) 下面是一个开启了jql扩展库的云函数的package.json示例,**注意不可有注释,以下文件内容中的注释仅为说明,如果拷贝此文件,切记去除注释** @@ -25,6 +34,12 @@ HBuilderX 3.3.1之前JQL只能在clientDB及JQL数据库管理里面使用,此 } ``` +对于确定在云函数/云对象中不需要使用 JQL 扩展库的,请对云函数右键,取消`uni-cloud-jql`扩展库。这样可以减少云函数体积,提高性能。 + +## 云函数中使用@use-in-function + +`uniCloud.databaseForJQL`方法,传入客户端信息,就可以得到一个JQL数据库操作对象。 + ```js // 简单的使用示例 'use strict'; @@ -40,7 +55,32 @@ exports.main = async (event, context) => { }; ``` -上述示例中jql扩展将会使用event内带有的uniIdToken对应的用户作为执行数据库操作的用户,如需指定执行当前数据库操作的用户请使用`setUser`方法 +## 云对象中使用@use-in-object + +> 新增于 HBuilderX 3.4.10 + +云对象中无法获取`event`和`context`,为方便在云对象中使用jql扩展,自HBuilderX 3.4.10起,`uniCloud.databaseForJQL`方法接收云对象`clientInfo`作为参数 + +**示例** + +```js +module.exports = { + addTodo (title, content) { + const dbJQL = uniCloud.databaseForJQL({ // 获取JQL database引用,此处需要传入云对象的clientInfo + clientInfo: this.getClientInfo() + }) + } +} +``` + + +## setUser指定用户身份 + +上述示例中,jql扩展使用的是客户端的身份,准确的说是客户端的uniIdToken对应的用户作为执行数据库操作的用户。 + +如需在云函数/云对象中指定执行其他用户身份,需使用`setUser`方法 + +setUser方法的参数是一个json对象,可传入uni-id的uid、role、permission,组合生效。 例: @@ -53,7 +93,7 @@ exports.main = async (event, context) => { }) dbJQL.setUser({ // 指定后续执行操作的用户信息,此虚拟用户将同时拥有传入的uid、role、permission uid: 'user-id', // 建议此处使用真实uid - role: ['admin'], // 指定当前执行用户的角色为admin + role: ['admin'], // 指定当前执行用户的角色为admin。如果只希望指定为admin身份,可以删除uid和permission节点 permission: [] }) const bookQueryRes = dbJQL.collection('book').where("name=='三国演义'").get() // 直接执行数据库操作 @@ -63,27 +103,16 @@ exports.main = async (event, context) => { }; ``` -## 云对象中使用@use-in-object -> 新增于 HBuilderX 3.4.10 +## 与clientDB的差异 -云对象中无法获取`event`和`context`,为方便在云对象中使用jql扩展,自HBuilderX 3.4.10起,`uniCloud.databaseForJQL`方法接收云对象`clientInfo`作为参数 +虽然都使用 JQL,但云端和客户端还是有一点区别 -**示例** - -```js -module.exports = { - addTodo (title, content) { - const dbJQL = uniCloud.databaseForJQL({ // 获取JQL database引用,此处需要传入云对象的clientInfo - clientInfo: this.getClientInfo() - }) - } -} -``` +- clientDB无论如何不可访问password类型字段,不管schema的权限如何,这类数据不传输到客户端。云函数内可以访问password类型字段,但受schema配置的权限约束。 +- clientDB有action云函数的概念,为了弥补客户端操作数据库的不足。云函数没有再使用action的必要了。 ## 注意事项 - JQL扩展依赖`uni-id`公共模块 -- JQL扩展库依赖redis扩展库进行数据缓存,未开通redis的服务空间无法使用缓存功能 - 启用了JQL扩展的云函数在本地调试时会自动使用本地schema、action、validateFunction以及uni-id公共模块 -- 由于此扩展会将`schema`、`action`、`validateFunction`带到模块内,如果你的上述文件较多会大幅增大云函数体积,因此启用此扩展的云函数**冷启动**时间会稍长,建议不要为太多云函数启用此扩展 \ No newline at end of file +- 由于此扩展会将`schema`、`action`、`validateFunction`带到模块内,如果你的上述文件较多会大幅增大云函数体积,因此启用此扩展的云函数**冷启动**时间会稍长,建议不要为太多云函数启用此扩展 diff --git a/docs/uniCloud/jql.md b/docs/uniCloud/jql.md index 27b476879..cddb768ce 100644 --- a/docs/uniCloud/jql.md +++ b/docs/uniCloud/jql.md @@ -1,8 +1,10 @@ ## JQL数据库操作 -`jql`,全称javascript query language,是一种js方式操作数据库的语法规范。 +`JQL`,全称 javascript query language,是一种js方式操作数据库的规范。 -`jql`大幅降低了js工程师操作数据库的难度、大幅缩短开发代码量。并利用json数据库的嵌套特点,极大的简化了联表查询和树查询的复杂度。 +- `JQL`大幅降低了js工程师操作数据库的难度,比SQL和传统MongoDB API更清晰、易掌握。 +- `JQL`支持强大的[DB Schema](schema.md),内置数据规则和权限。DB Schema 支持[uni-id](uni-id-summary.md),可直接使用其角色和权限。无需再开发各种数据合法性校验和鉴权代码。 +- `JQL`利用json数据库的嵌套特点,极大的简化了联表查询和树查询的复杂度,并支持更加灵活的虚拟表。 #### jql的诞生背景 @@ -163,7 +165,7 @@ db.collection('user').where({ **注意** -- 这些变量使用时并非直接获取对应的值,而是生成一个标记,在执行数据库操作时再将这个标记替换为实际的值 +- 这些变量使用时并非直接获取对应的值,而是生成一个标记,在云端执行数据库操作时再将这个标记替换为实际的值 ## jql条件语句的运算符@operator @@ -2943,13 +2945,13 @@ const res = await db.collection('test').aggregate() .end() ``` -## 更新操作符@update-command +## 更新操作符(重命名或删除字段)@update-command > 新增于 HBuilderX 3.5.1,JQL数据库管理支持使用更新操作符 -更新操作符可以在执行更新时使用。比如对字段重命名(rename)、删除字段(remove)等 +更新操作符可以在执行更新时使用。比如对字段重命名(rename)、删除字段(remove)等。适用于表结构变更后,使用 HBuilderX 的 JQL管理器进行数据变更。 -重命名字段示例: +`db.command.rename`重命名字段: ```js db.collection('test').update({ @@ -2957,7 +2959,7 @@ db.collection('test').update({ }) ``` -删除字段示例: +`db.command.remove`删除字段: ```js db.collection('test').update({ @@ -2967,8 +2969,9 @@ db.collection('test').update({ **注意** -- 仅JQL数据库管理支持 -- 使用更新操作符后,将完全跳过所有数据校验操作 +- 仅 HBuilderX 3.5.1+ 中的 JQL数据库管理器中可用 +- 支持批量传入重命名或删除指令 +- 使用更新操作符后,将完全跳过所有数据校验操作,即无论schema中如何配置数据的值域规则,都将无法生效。所以更新操作符不宜与普通的数据增删改混在一起执行。 ## DBSchema@schema @@ -3337,9 +3340,8 @@ module.exports = { **参考:** -- [uni-id 文档](https://uniapp.dcloud.net.cn/uniCloud/uni-id) -- [uni-config-center 文档](https://ext.dcloud.net.cn/plugin?id=4425) - +- [uni-id 文档](uni-id-summary.md) +- [uni-config-center 文档](uni-config-center.md) 扩展库: @@ -3350,7 +3352,6 @@ module.exports = { **注意** - action上传后可能需要一段时间才会在云端生效,通常是3分钟左右 - ## 数据库运算方法列表@aggregate-operator uniCloud的云数据库,提供了一批强大的运算方法。这些方法是数据库执行的,而不是云函数执行的。 @@ -3562,16 +3563,16 @@ const res = await db.collection('stats') groupField内可使用且仅能使用如下运算方法。 -|操作符 |用途 |用法 |说明 | -|--- |--- |--- |--- | -|addToSet |向数组中添加值,如果数组中已存在该值,不执行任何操作 |addToSet(表达式) |- | -|avg |返回指定表达式对应数据的平均值 |avg(表达式) |- | -|first |返回指定字段在一组集合的第一条记录对应的值。仅当这组集合是按照某种定义排序( sort )后,此操作才有意义 |first(表达式) |- | -|last |返回指定字段在一组集合的最后一条记录对应的值。仅当这组集合是按照某种定义排序( sort )后,此操作才有意义。 |last(表达式) |- | -|max |返回一组数值的最大值 |max(表达式) |- | -|min |返回一组数值的最小值 |min(表达式) |- | -|push |返回一组中表达式指定列与对应的值,一起组成的数组 |push(表达式) |- | -|stdDevPop |返回一组字段对应值的标准差 |stdDevPop(表达式) |- | -|stdDevSamp |计算输入值的样本标准偏差 |stdDevSamp(表达式) |- | -|sum |返回一组字段所有数值的总和 |sum(表达式) |- | -|mergeObjects |将一组对象合并为一个对象 |mergeObjects(表达式) |在groupField内使用时仅接收一个参数 | +|操作符 |用途 |用法 |说明 | +|--- |--- |--- |--- | +|addToSet |向数组中添加值,如果数组中已存在该值,不执行任何操作 |addToSet(表达式) |- | +|avg |返回指定表达式对应数据的平均值 |avg(表达式) |- | +|first |返回指定字段在一组集合的第一条记录对应的值。仅当这组集合是按照某种定义排序( sort )后,此操作才有意义 |first(表达式) |- | +|last |返回指定字段在一组集合的最后一条记录对应的值。仅当这组集合是按照某种定义排序( sort )后,此操作才有意义。 |last(表达式) |- | +|max |返回一组数值的最大值 |max(表达式) |- | +|min |返回一组数值的最小值 |min(表达式) |- | +|push |返回一组中表达式指定列与对应的值,一起组成的数组 |push(表达式) |- | +|stdDevPop |返回一组字段对应值的标准差 |stdDevPop(表达式) |- | +|stdDevSamp |计算输入值的样本标准偏差 |stdDevSamp(表达式) |- | +|sum |返回一组字段所有数值的总和 |sum(表达式) |- | +|mergeObjects |将一组对象合并为一个对象 |mergeObjects(表达式) |在groupField内使用时仅接收一个参数 | diff --git a/docs/uniCloud/opendb.md b/docs/uniCloud/opendb.md index 7106ede19..0afbf007a 100644 --- a/docs/uniCloud/opendb.md +++ b/docs/uniCloud/opendb.md @@ -19,7 +19,7 @@ - 数据孤岛问题。当多个应用之间的数据库规范相同,他们之间的跨应用数据交换就变的更容易。未来uniCloud会提供更方便的跨应用数据交换机制。 - 统一的初始数据。比如地区表等数据,在openDB中有初始化数据,开发者们共享一个相同数据源即可。 -[uni-id](https://uniapp.dcloud.io/uniCloud/uni-id)的账户统一,是`openDB`的成功实践。基于uni-id规范,有电商插件、有IM插件、有PC管理插件,开发者可以方便的把这些插件整合到自己的同一应用中。 +[uni-id](uni-id-summary.md)的账户统一,是`openDB`的成功实践。基于uni-id规范,有电商插件、有IM插件、有PC管理插件,开发者可以方便的把这些插件整合到自己的同一应用中。 ## openDB中的已有规范 diff --git a/docs/uniCloud/quickstart.md b/docs/uniCloud/quickstart.md index c2c1a4b61..ded9f2881 100644 --- a/docs/uniCloud/quickstart.md +++ b/docs/uniCloud/quickstart.md @@ -41,40 +41,6 @@ Hello uniCloud 的源码地址:[https://ext.dcloud.net.cn/plugin?id=4082](http 3. 运行 hello uniCloud项目 - 在运行菜单运行项目,浏览器、app、小程序均可。uniCloud项目是云端一体的,运行前端后控制台会同时出现前端和云端的控制台。 -## 目录结构@structure - -uniCloud云开发环境创建成功后,项目根目录下会有一个带有云图标的特殊目录,名为“uniCloud”。(即便是cli创建的项目,云函数目录也在项目的根目录下,而不是src下) - -
-	
-┌──uniCloud-aliyun                    云空间目录,阿里云为uniCloud-aliyun,腾讯云为uniCloud-tcb。但HBuilderX项目管理器会隐藏显示后缀,只显示uniCloud
-|   |——— cloudfunctions               云函数目录
-|   |   │───common                    云函数公用模块目录 详情
-|   |   |   └──hello-common           云函数公用模块
-|   |   |      │──index.js            公用模块代码
-|   |   |      └──package.json        公用模块package.json
-|   |   │───uni-clientDB-actions
-|   |   │      └──new_action.js       clientDB action代码 详情
-|   |   └───function-name             普通云函数目录
-|   |         │──index.js             云函数入口代码
-|   |         └──package.json         包含云函数的配置信息,如url化、定时设置、内存等内容 详情
-|   |   └───object-name               云对象目录
-|   |         │──index.obj.js         云对象入口代码
-|   |         └──package.json         包含云对象的配置信息详情
-│   └──database                       云数据目录
-│         │──validateFunction         数据库扩展校验函数目录
-│         │   └──new_validation.js    扩展校验函数代码 详情
-│         │──db_init.json             db_init.json初始化数据库文件,其中不再包含schema 详情
-│         └──xxx.schema.json          数据表xxx的 DB Schema 详情
-根目录
-	
-
- -**注意** -- uniCloud目录是存放服务端文件的目录,它和前端代码在同一个项目下是为了方便管理。在发行前端部分,比如打包app、小程序、h5的代码包里并不会包含uniCloud目录。 -- HBuilderX 3.0之前目录结构较老,没有uniCloud目录,根目录直接是cloudfunctions。不支持database和云对象,不推荐再使用老版。 - - ## 开发自己的第一个uniCloud项目 1. 创建uniCloud项目 @@ -87,9 +53,7 @@ uniCloud云开发环境创建成功后,项目根目录下会有一个带有云 一个开发者可以拥有多个服务空间,每个服务空间都是一个独立的serverless云环境,不同服务空间之间的云函数、数据库、存储都是隔离的。 -服务空间和手机端项目是多对多绑定关系。同账号下,一个项目可以关联到多个服务空间。一个服务空间也可以被多个项目访问。 - -对目录`uniCloud`点右键选择`关联云服务空间`,绑定之前创建的服务空间,或者新建一个服务空间。 +对项目根目录`uniCloud`点右键选择`关联云服务空间`,绑定之前创建的服务空间,或者新建一个服务空间。 3. 创建云函数/云对象 @@ -102,8 +66,8 @@ uniCloud云开发环境创建成功后,项目根目录下会有一个带有云 -创建云函数后,生成一个目录,该目录下自动生成index.js,是该云函数的入口文件,不可改名。 -创建云对象后,生成一个目录,该目录下自动生成index.obj.js,是该云对象的入口文件,不可改名。 +- 创建云函数后,生成一个目录,该目录下自动生成index.js,是该云函数的入口文件,不可改名。 +- 创建云对象后,生成一个目录,该目录下自动生成index.obj.js,是该云对象的入口文件,不可改名。 如果该云函数/云对象还需要引入其他js,可在index.js入口文件中引用。 @@ -128,7 +92,7 @@ module.exports = { 在项目首页,pages/index/index.vue 里,添加一个按钮,点击后执行异步方法sum。 -js中import这个 helloco 对象,调用它的 sum 方法 +js 中 import 这个 helloco 对象,调用它的 sum 方法 ```html