From 58a838a4b0232a165cec8f6b4ef387765ae3f611 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E4=BA=9A=E7=90=AA?= Date: Wed, 29 Dec 2021 16:06:01 +0800 Subject: [PATCH] docs: uniCloud --- docs/uniCloud/db-performance.md | 4 +- docs/uniCloud/hellodb.md | 88 +----------------------------- docs/uniCloud/init.md | 24 ++++----- docs/uniCloud/price.md | 95 ++++++++++++++++++++++++++++++++- 4 files changed, 109 insertions(+), 102 deletions(-) diff --git a/docs/uniCloud/db-performance.md b/docs/uniCloud/db-performance.md index bff7e7e45..a118f1dda 100644 --- a/docs/uniCloud/db-performance.md +++ b/docs/uniCloud/db-performance.md @@ -53,11 +53,11 @@ module.exports = async function(event,context) { ### 抽样方法sample -sample操作在高频触发时会响应缓慢,使用前请务必确定自己的业务场景适合使用sample方法 +sample操作在大数据量高频触发时会响应缓慢,使用前请务必确定自己的业务场景适合使用sample方法 ## clientDB联表查询超时@client-db-lookup -请参考此文档调整优化,[使用getTemp进行联表查询](https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=lookup-with-temp) +请参考此文档调整优化,[使用getTemp进行联表查询](https://uniapp.dcloud.net.cn/uniCloud/jql?id=lookup-with-temp) ## 慢查询日志@slow diff --git a/docs/uniCloud/hellodb.md b/docs/uniCloud/hellodb.md index c2892d62e..472660668 100644 --- a/docs/uniCloud/hellodb.md +++ b/docs/uniCloud/hellodb.md @@ -602,90 +602,4 @@ uniCloud提供的`db_init.json`主要是为了对数据库进行初始化,并 ### 云厂商之间的迁移@cross-provider -目前可以使用云数据库的导入导出进行迁移,迁移数据库之前可以使用导出db_init.json功能将所有集合及索引导出。再使用数据导入导出功能进行迁移 -> 也可以直接使用第三方封装好的插件:[unicloud数据库一键搬家工具,支持阿里云与腾讯云互转。支持跨账号转。](https://ext.dcloud.net.cn/plugin?id=6089) - -#### 腾讯云迁移到阿里云@tencent-to-aliyun - -迁移数据可以通过在腾讯云服务空间导出数据表为json文件,在阿里云服务空间导入json文件到表的方式进行迁移。 - -#### 阿里云迁移到腾讯云@aliyun-to-tencent - -由于此前腾讯云并未完全支持ObjectId类型的数据,在阿里云迁移到腾讯云时需要注意处理一下`ObjectId`类型的数据,包括自动生成的_id字段以及关联到其他表的_id的字段。简单来说就是将导出的数据内的ObjectId类型的数据处理成字符串且不满足ObjectId的格式。 - -例: - -```js -// 原始数据 -{"_id":{"$oid":"60fa6d25cd84d60001ec38a2"},"uid":{"$oid":"60fa6d1d2e5faa0001ade857"}} - -// 调整后的数据 -{"_id":"60fa6d25cd84d60001ec38a2a","uid":"60fa6d1d2e5faa0001ade857a"} // 在结尾追加了一个“a”使其不满足ObjectId格式 -``` - -以下为一个简单的脚本示例用于处理导出的json文件 - -如果将此文件存储为`parse.js`,使用`node parse.js 输入文件相对或绝对路径 输出文件相对或绝对路径`即可处理导出的json文件 - -```js -const fs = require('fs') -const path = require('path') -const readline = require('readline') - -const cwd = process.cwd() -const inputPath = path.resolve(cwd, process.argv[2]) -const outputPath = path.resolve(cwd, process.argv[3]) - -if (fs.existsSync(outputPath)) { - throw new Error(`输出路径(${outputPath})已存在`) -} - -function getType(val) { - return Object.prototype.toString.call(val).slice(8, -1).toLowerCase() -} -function parseRecord(obj) { - const type = getType(obj) - switch (type) { - case 'object': - if (obj.$oid) { - return obj.$oid + 'a' - } - const keys = Object.keys(obj) - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - obj[key] = parseRecord(obj[key]) - } - return obj - case 'array': - for (let i = 0; i < obj.length; i++) { - obj[i] = parseRecord(obj[i]) - } - return obj - default: - return obj - } -} - -async function parseCollection() { - const inputStream = fs.createReadStream(inputPath) - const outputStream = fs.createWriteStream(outputPath) - - const rl = readline.createInterface({ - input: inputStream - }); - - for await (const line of rl) { - const recordStr = line.trim() - if (!recordStr) { - continue - } - const record = parseRecord(JSON.parse(recordStr)) - outputStream.write(JSON.stringify(record) + '\n') - } - rl.close() - console.log(`处理后的文件已输出到${outputPath}`) -} - -parseCollection() - -``` \ No newline at end of file +文档移至:[在云厂商之间迁移数据库](uniCloud/price.md?id=cross-provider-db) \ No newline at end of file diff --git a/docs/uniCloud/init.md b/docs/uniCloud/init.md index 06afe264c..02ae15ea8 100644 --- a/docs/uniCloud/init.md +++ b/docs/uniCloud/init.md @@ -22,12 +22,12 @@ function init(options):uniCloud **options 参数说明** -|参数名 |类型 |必填 |默认值 |说明 | -|:-: |:-: |:-: |:-: |:-: | -|provider |String |是 |- |aliyun、tencent | -|spaceId |String |是 |- |服务空间ID,**注意是服务空间ID,不是服务空间名称** | -|clientSecret |String |是 |- |仅阿里云支持,可以在[uniCloud控制台](https://unicloud.dcloud.net.cn)服务空间列表中查看 | -|endpoint |String |否 |`https://api.bspapp.com` |服务空间地址,仅阿里云侧支持 | +|参数名 |类型 |必填 |默认值 |说明 | +|:-: |:-: |:-: |:-: |:-: | +|provider |String |是 |- |aliyun、tencent | +|spaceId |String |是 |- |服务空间ID,**注意是服务空间ID,不是服务空间名称** | +|clientSecret |String |是 |- |仅阿里云支持,可以在[uniCloud控制台](https://unicloud.dcloud.net.cn)服务空间列表中查看 | +|endpoint |String |否 |`https://api.bspapp.com` |服务空间地址,仅阿里云侧支持 | **示例代码** @@ -68,9 +68,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` |服务空间地址,仅阿里云侧支持 | +|参数名 |类型 |必填 |默认值 |说明 | +|:-: |:-: |:-: |:-: |:-: | +|provider |String |是 |- |aliyun、tencent | +|spaceId |String |是 |- |服务空间ID,**注意是服务空间ID,不是服务空间名称** | +|clientSecret |String |是 |- |仅阿里云支持,可以在[uniCloud控制台](https://unicloud.dcloud.net.cn)服务空间列表中查看 | +|endpoint |String |否 |`https://api.bspapp.com` |服务空间地址,仅阿里云侧支持 | diff --git a/docs/uniCloud/price.md b/docs/uniCloud/price.md index 04d1097fe..a832018e1 100644 --- a/docs/uniCloud/price.md +++ b/docs/uniCloud/price.md @@ -606,4 +606,97 @@ uniCloud提供包月、按量计费两种计费方式(仅腾讯云),具体 ## 发生故障时如何判断故障点 -当你的线上系统故障时,可以参考此文档判断责任归属:[如何判断是DCloud或阿里云或腾讯云的问题](https://uniapp.dcloud.io/uniCloud/faq?id=fault) \ No newline at end of file +当你的线上系统故障时,可以参考此文档判断责任归属:[如何判断是DCloud或阿里云或腾讯云的问题](https://uniapp.dcloud.io/uniCloud/faq?id=fault) + +## 云厂商之间的迁移@cross-provider + +### 数据库迁移@cross-provider-db + +目前可以使用云数据库的导入导出进行迁移,迁移数据库之前可以使用导出db_init.json功能将所有集合及索引导出。再使用数据导入导出功能进行迁移。导入导出请参考:[数据导入导出和备份](uniCloud/hellodb.md?id=dbmigration) + +> 也可以直接使用第三方封装好的插件:[unicloud数据库一键搬家工具,支持阿里云与腾讯云互转。支持跨账号转。](https://ext.dcloud.net.cn/plugin?id=6089) + +#### 腾讯云迁移到阿里云@tencent-to-aliyun-db + +迁移数据可以通过在腾讯云服务空间导出数据表为json文件,在阿里云服务空间导入json文件到表的方式进行迁移。 + +#### 阿里云迁移到腾讯云@aliyun-to-tencent-db + +由于此前腾讯云并未完全支持ObjectId类型的数据,在阿里云迁移到腾讯云时需要注意处理一下`ObjectId`类型的数据,包括自动生成的_id字段以及关联到其他表的_id的字段。简单来说就是将导出的数据内的ObjectId类型的数据处理成字符串且不满足ObjectId的格式。 + +例: + +```js +// 原始数据 +{"_id":{"$oid":"60fa6d25cd84d60001ec38a2"},"uid":{"$oid":"60fa6d1d2e5faa0001ade857"}} + +// 调整后的数据 +{"_id":"60fa6d25cd84d60001ec38a2a","uid":"60fa6d1d2e5faa0001ade857a"} // 在结尾追加了一个“a”使其不满足ObjectId格式 +``` + +以下为一个简单的脚本示例用于处理导出的json文件 + +如果将此文件存储为`parse.js`,使用`node parse.js 输入文件相对或绝对路径 输出文件相对或绝对路径`即可处理导出的json文件 + +```js +const fs = require('fs') +const path = require('path') +const readline = require('readline') + +const cwd = process.cwd() +const inputPath = path.resolve(cwd, process.argv[2]) +const outputPath = path.resolve(cwd, process.argv[3]) + +if (fs.existsSync(outputPath)) { + throw new Error(`输出路径(${outputPath})已存在`) +} + +function getType(val) { + return Object.prototype.toString.call(val).slice(8, -1).toLowerCase() +} +function parseRecord(obj) { + const type = getType(obj) + switch (type) { + case 'object': + if (obj.$oid) { + return obj.$oid + 'a' + } + const keys = Object.keys(obj) + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + obj[key] = parseRecord(obj[key]) + } + return obj + case 'array': + for (let i = 0; i < obj.length; i++) { + obj[i] = parseRecord(obj[i]) + } + return obj + default: + return obj + } +} + +async function parseCollection() { + const inputStream = fs.createReadStream(inputPath) + const outputStream = fs.createWriteStream(outputPath) + + const rl = readline.createInterface({ + input: inputStream + }); + + for await (const line of rl) { + const recordStr = line.trim() + if (!recordStr) { + continue + } + const record = parseRecord(JSON.parse(recordStr)) + outputStream.write(JSON.stringify(record) + '\n') + } + rl.close() + console.log(`处理后的文件已输出到${outputPath}`) +} + +parseCollection() + +``` \ No newline at end of file -- GitLab