云開發(fā) 數(shù)據(jù)庫(kù)的管理

2020-07-22 15:31 更新

一、控制臺(tái)數(shù)據(jù)庫(kù)高級(jí)操作

在云開發(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 /
其他 不支持

二、數(shù)據(jù)庫(kù)腳本的實(shí)際應(yīng)用

云開發(fā)控制臺(tái)的數(shù)據(jù)可視化管理和高級(jí)操作還可以實(shí)現(xiàn)很多類似于關(guān)系型數(shù)據(jù)庫(kù)GUI管理工具的功能,畢竟GUI管理的背后就是數(shù)據(jù)庫(kù)的腳本操作,更多功能大家可以自己多探索,下面只簡(jiǎn)單介紹一些例子:

1、批量刪除一個(gè)集合內(nèi)的多條記錄

我們?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,所以就能都刪除了。

2、如何給集合內(nèi)所有數(shù)據(jù)都新增一個(gè)字段

我現(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(),
    }
  })

3、如何讓記錄按照自己預(yù)想的方式來排序

我在小程序端批量上傳了圖片、文章,但是發(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。

4、如何新增多條數(shù)據(jù)

使用數(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,
      }
    ]
  })

三、數(shù)據(jù)庫(kù)的導(dǎo)入導(dǎo)出

除了可以使用云開發(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)然方法也不僅限于此,我們還可以用以下方法:

1、cloudbase-manager-node

我有很多圖片、文件批量導(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ì)介紹到。

2、HTTP API 中的數(shù)據(jù)庫(kù)接口

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

四、使用回檔進(jìn)行數(shù)據(jù)備份

云開發(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ù)。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)