在云開發(fā)控制臺(tái)的數(shù)據(jù)庫(kù)管理頁中可以編寫和執(zhí)行數(shù)據(jù)庫(kù)腳本,腳本可對(duì)數(shù)據(jù)庫(kù)進(jìn)行增刪查改以及聚合的操作,語法與之前的API語法相同。通過數(shù)據(jù)庫(kù)腳本的操作可以彌補(bǔ)云開發(fā)控制臺(tái)可視化操作的不足。
腳本已經(jīng)有了以下全局變量,這樣我們就可以直接在腳本里面使用db
、指令_
和聚合了$
了
const db = wx.cloud.database()
const _ = db.command
const $ = db.command.aggregate
數(shù)據(jù)庫(kù)腳本還支持以下表達(dá)式,主要是常量、變量和對(duì)象的聲明以及數(shù)據(jù)庫(kù)API的調(diào)用表達(dá)式:
表達(dá)式 | 支持方式 | 示例 |
---|---|---|
獲取屬性 | 支持獲取對(duì)象的合法屬性,對(duì)象如 db、_,合法屬性如 db 的 collection 屬性 | db.collection |
函數(shù)調(diào)用 | 支持 | db.collection() |
new | 支持 | new db.Geo.Point(113, 23) |
變量聲明 | 支持變量聲明,同時(shí)支持對(duì)象解構(gòu)器的聲明方式 | const Geo = db.Geo const { Point } = db.Geo |
對(duì)象聲明 | 支持 | const obj = { age: _.gt(10) } |
常量聲明 | 支持 | const max = 10 |
負(fù)數(shù) | 支持 | const min = -5 |
注釋 | 支持 | // comment / comment / |
其他 | 不支持 |
云開發(fā)控制臺(tái)的數(shù)據(jù)可視化管理和高級(jí)操作還可以實(shí)現(xiàn)很多類似于關(guān)系型數(shù)據(jù)庫(kù)GUI管理工具的功能,畢竟GUI管理的背后就是數(shù)據(jù)庫(kù)的腳本操作,更多功能大家可以自己多探索,下面只簡(jiǎn)單介紹一些例子:
我們?cè)陂_發(fā)的過程中,一個(gè)集合內(nèi)有幾百條、幾千條數(shù)據(jù)希望全部清空,但是又不想刪掉該集合再重建,那應(yīng)該如何做呢,總不能一條一條刪除吧?云開發(fā)控制臺(tái)的可視化操作目前無法做到批量刪除一個(gè)集合內(nèi)的多條記錄的,但是這個(gè)功能我們可以通過控制臺(tái)數(shù)據(jù)庫(kù)高級(jí)操作的腳本來輕松進(jìn)行批量刪除,而且還可以創(chuàng)建一個(gè)腳本模板,有需要直接點(diǎn)擊執(zhí)行腳本模板做到長(zhǎng)期復(fù)用。比如我們要?jiǎng)h除集合為china的所有記錄:
db.collection('china')
.where({
_id: _.exists(true)
})
.remove()
由于remove請(qǐng)求只支持通過匹配 where 語句來刪除,我們可以在where里包含一個(gè)條件只要存在_id就刪除,由于基本每個(gè)記錄都有_id,所以就能都刪除了。
我現(xiàn)在一個(gè)集合內(nèi)有N條數(shù)據(jù),由于數(shù)據(jù)庫(kù)初期設(shè)計(jì)的問題,現(xiàn)在想給所有記錄新增一個(gè)字段,想像進(jìn)行關(guān)系型數(shù)據(jù)庫(kù)和Excel新增一列的類似操作,那我應(yīng)該怎么做呢?同樣我們也可以通過控制臺(tái)數(shù)據(jù)庫(kù)高級(jí)操作的腳本。比如我們想給china集合內(nèi)的所有記錄都新增一個(gè)updateTime的字段,我們可以查詢到需要新增字段的記錄,然后使用update請(qǐng)求,當(dāng)記錄內(nèi)沒有updateTime字段就會(huì)新增:
const serverDate = db.serverDate
db.collection('china')
.where({
_id: _.exists(true)
})
.update({
data: {
updateTime: serverDate(),
}
})
我在小程序端批量上傳了圖片、文章,但是發(fā)現(xiàn)它們的顯示順序并不是按照我上傳順序來進(jìn)行排序,但是我有不少功能卻非常依賴排序這個(gè)功能,請(qǐng)問我應(yīng)該怎么做?
批量上傳或者你按時(shí)間上傳,記錄的排序并不會(huì)按照你認(rèn)為的順序來排序是很正常的,查詢到的數(shù)據(jù)的順序一般也不會(huì)是控制臺(tái)數(shù)據(jù)庫(kù)顯示的順序,這個(gè)都是非常正常的。你如果對(duì)排序有需求,有兩種方式,一種是你在開發(fā)時(shí)就能設(shè)計(jì)好排序的字段,比如想讓文章能按時(shí)間來排序,就應(yīng)該在小程序發(fā)表文章時(shí)就設(shè)置一個(gè)字段來記錄文章的發(fā)布時(shí)間,還有一種方式就是手動(dòng)加字段來自定義,比如輪播的順序,文章置頂或調(diào)整順序這些,可能你還沒有來得及開發(fā)相關(guān)功能,我們可以使用控制臺(tái)來自定義,比如給你要排序的記錄新增一個(gè)字段來自定義你想要的排序順序,然后再在數(shù)據(jù)查詢時(shí)使用orderBy。
使用數(shù)據(jù)庫(kù)腳本可以實(shí)現(xiàn)一次性增加多條數(shù)據(jù),目前即使用云函數(shù)也無法做到一次增加多條數(shù)據(jù)庫(kù)到集合里,在語法上,這兩者的差異在于,數(shù)據(jù)庫(kù)腳本的data支持Array數(shù)組,而API db.collection('').add({data:{}})
里的data目前只支持對(duì)象Object.
db.collection('china')
.add({
data: [
{
"_id":"202003041020001",
"city":"駐馬店",
"province":"河南",
"city_area":15000,
"builtup_area":75.1,
"reg_pop":905.0,
"resident_pop":696.0,
"gdp":1807.69,
},
{
"_id":"202003041020002",
"city":"紹興",
"province":"浙江",
"city_area":8279,
"builtup_area":199.4,
"reg_pop":443.11,
"resident_pop":496.8,
"gdp":4465.97,
}
]
})
除了可以使用云開發(fā)控制臺(tái)以及騰訊云網(wǎng)頁的云開發(fā)控制臺(tái)對(duì)數(shù)據(jù)庫(kù)里面的數(shù)據(jù)進(jìn)行導(dǎo)入導(dǎo)出以外,在前面我們也介紹了如何使用云函數(shù)的后端能力對(duì)數(shù)據(jù)進(jìn)行導(dǎo)入導(dǎo)出,當(dāng)然方法也不僅限于此,我們還可以用以下方法:
我有很多圖片、文件批量導(dǎo)入到了云存儲(chǔ),但是我批量獲取這些文件的fileID應(yīng)該怎么做?我的數(shù)據(jù)庫(kù)有幾十個(gè)集合,數(shù)據(jù)庫(kù)經(jīng)常需要備份,每次都要一個(gè)個(gè)導(dǎo)出非常麻煩,有沒有好的方法?
如果大家有類似的功能,大家可以使用cloudbase-manager-node。cloudbase-manager-node的功能非常強(qiáng)大,里面有相比于@cloudbase/node-sdk更加豐富的接口,當(dāng)然這些功能都需要開發(fā)人員可以結(jié)合接口進(jìn)行一定的開發(fā)。
比如我們想批量獲取云存儲(chǔ)文件的fileID,可以使用listDirectoryFiles(cloudPath: string): Promise<IListFileInfo[]>
列出文件夾下所有文件的名稱,也可以使用downloadDirectory(options): Promise<void>
來下載文件夾,比如我們想對(duì)所有集合的數(shù)據(jù)進(jìn)行備份,可以使用listCollections(options: object): object
來獲取所有集合的名稱,然后使用export(collectionName: string, file: object, options: object): object
接口來導(dǎo)出所有記錄到指定的json或csv文件里。這個(gè)在后面我們會(huì)大致介紹如何使用。
如果我們想要將云存儲(chǔ)里面的文件或文件夾下載備份,將本地電腦的文件或文件夾批量上傳到云存儲(chǔ),可以使用Cloudbase CLI工具,這個(gè)非常簡(jiǎn)單,在后面的章節(jié)CloudBase CLI會(huì)介紹到。
HTTP API是一個(gè)非常通用的方式,無論是哪個(gè)平臺(tái)、哪種語法都可以使用HTTP API對(duì)云開發(fā)資源里的數(shù)據(jù)進(jìn)入導(dǎo)入和導(dǎo)出,這里就不具體介紹代碼細(xì)節(jié)了,我們可以使用以下接口實(shí)現(xiàn)導(dǎo)入:
POST https://api.weixin.qq.com/tcb/databasemigrateimport?access_token=ACCESS_TOKEN
可以使用以下接口進(jìn)行導(dǎo)出:
POST https://api.weixin.qq.com/tcb/databasemigrateexport?access_token=ACCESS_TOKEN
云開發(fā)提供了數(shù)據(jù)庫(kù)回檔功能,系統(tǒng)會(huì)自動(dòng)開啟數(shù)據(jù)庫(kù)備份,并于每日凌晨自動(dòng)進(jìn)行一次數(shù)據(jù)備份,最長(zhǎng)保存 7 天的備份數(shù)據(jù)。開發(fā)者可以在數(shù)據(jù)庫(kù)操作錯(cuò)誤或者出現(xiàn)其他情況時(shí),可在云控制臺(tái)上通過新建回檔任務(wù)將集合回檔(還原)至指定時(shí)間點(diǎn),實(shí)現(xiàn)部分?jǐn)?shù)據(jù)找回,保證數(shù)據(jù)的安全。
回檔期間,數(shù)據(jù)庫(kù)的數(shù)據(jù)訪問不受影響?;貦n完成后,開發(fā)者可在集合列表中看到原有數(shù)據(jù)庫(kù)集合和回檔后的集合。這樣之前的數(shù)據(jù)就可以找回來了,并與已有的集合里的數(shù)據(jù)進(jìn)行比對(duì)?;貦n已完成后,開發(fā)者可以根據(jù)情況,在集合列表中選擇對(duì)應(yīng)集合,右鍵重命名該集合名稱??词欠駟⒂没貦n后的數(shù)據(jù)。
更多建議: