雲數據庫和雲存儲使用

雲數據庫使用

雲數據庫(數據存儲服務)是基於MongoDB託管在雲端的數據庫,數據以JSON格式存儲。作為開發者,您可以在客戶端內直接操作數據,也可以在雲函數中讀寫數據。

步驟一:設置數據表權限

小程序Serverless提供了一套簡明易懂的JSON語法用來控制用戶對資源的訪問,類似於身份驗證體系裡的IAM或者網絡安全中的ACL。您可以通過修改權限規則來控制數據表權限。
小程序Serverless會為每個新建的數據表自動提供一個默認權限規則。默認新建數據表無任何操作權限,您可以通過添加權限規則管理數據表的權限。
1.打開小程序雲控制檯,在雲數據庫頁面,單擊權限圖標15.png

2.在設置數據庫權限頁面,設置權限規則。然後直接修改安全規則。
3.修改完成後,單擊確定。

步驟二:數據庫操作

創建數據表
小程序Serverless服務使用的是分佈式文件存儲數據庫MongoDB,以JSON格式存儲數據。數據庫中的每條記錄都是一個JSON格式的對象,一個數據庫可以包含多個集合(相當於關係型數據庫中的表)。您可以在控制檯上創建數據表。
1.打開小程序雲控制檯,在雲數據庫頁面,選擇要關聯的環境。
2.點擊添加圖標14.png
,輸入數據表名稱,最後單擊確定。
小程序端調用
1.在小程序客戶端代碼根目錄執行以下命令安裝 SDK。

npm install @alicloud/mpserverless-sdk --save

2.在 app.js 中初始化SDK(全局只需初始化一次)

// 1. 引入必要的 sdk
import MPServerless from '@alicloud/mpserverless-sdk';
 
// 2. 在 app.js 中對 sdk 進行初始化
// 2.1 初始化 MPServerless
my.serverless = my.serverless || new MPServerless({
  uploadFile: my.uploadFile,
  request: my.request,
  getAuthCode: my.getAuthCode,
}, {
  // 2.2 參數能在小程序雲服務空間詳情中獲取
  appId: '',
  spaceId: '',
  clientSecret: '',
  endpoint: ''
});

3.在小程序頁面操作數據庫

// 1.添加一條記錄
my.serverless.db.collection('users').insertOne({
    name: 'tom',
    age: 1
})
.then(res => {})
.catch(console.error);
// 2.刪除一條記錄
my.serverless.db.collection('users')
  .deleteOne({
    name: 'Tom'
  })
  .then((res) => {
    const hasDeleted = res.affectedDocs > 0;
  })
  .catch(console.error);
// 3.更新集合中的一條記錄
my.serverless.db.collection('users').updateOne({
    name: 'jerry'
}, {
    $set: {
        age: 10
    }
})
.then(res => {})
.catch(console.error);
// 4.查詢一條記錄
// 調用findOne方法查詢大於且最接近18歲的一條記錄的name。
//   projection: { name: 1 }表示只返回name字段,其中1表示過濾,0表示排除。
//   sort: { age: 1 }表示將查詢後的結果按升序排列,其中1表示升序,-1表示降序。
my.mpserverless.db.collection('users')
  .findOne({
    age: { $gt: 18 }
  }, {
    projection: { name: 1 },
    sort: { age: 1 }
  })
  .then(res => { })
  .catch(console.error);

雲函數端調用

// 添加一條記錄
module.exports = async function (ctx) {
  return await ctx.mpserverless.db.collection('users').insertOne({
     name: 'tom',
      age: 1
  });
};

數據庫常用語法說明

數據存儲服務是基於MongoDB託管在雲端的數據庫,使用MongoDB 3.4版本,常用的數據庫操作語法如下。
聚合查詢aggregate
計算記錄條數count
刪除一條數據記錄deleteOne
刪除一批數據記錄deleteMany
獲取去重後的記錄distinct
查詢記錄find
查詢單條記錄findOne
查詢並刪除一條記錄findOneAndDelete
查詢並替換一條記錄findOneAndReplace
查詢並更新記錄findOneAndUpdate
替換記錄replaceOne
添加一批記錄insertMany
添加一條記錄insertOne
更新一批記錄updateMany
更新一條記錄updateOne

設置數據庫索引

使用數據庫時,對成為查詢條件的字段設置索引可以有效提高查詢效率,更快的獲取信息。缺省情況下會對_id_字段默認創建一個非唯一索引。
1.在數據庫頁面,單擊目標數據表,然後單擊索引頁籤進入索引設置頁面。
2.點擊添加索引進入索引設置頁面。.
3.填寫索引名稱,設置索引屬性、索引字段。
• 索引屬性:可以設置為唯一索引或非唯一索引。

將字段設置為唯一索引後,可以防止不同記錄的被索引鍵上存儲相同值。

• 索引字段:支持單鍵索引和複合索引設置,字段按升序或降序排列。

單鍵索引是最常見的索引形式,針對一個指定字段建立索引。對於單字段索引,升序、降序的查詢效果一樣。

複合索引是是單鍵索引的升級版,針對多個字段聯合創建索引,先按照第一個字段排列,第一個字段相同的記錄按第二個字段排列,依次類推。

4.單擊保存按鈕,保存索引設置。
10.jpeg
11.jpeg

雲存儲使用

mpserverless.file 對象提供 uploadFile 和 deleteFile方法管理文件。上傳的文件將通過CDN進行網絡加速。

步驟一:設置文件權限

小程序Serverless提供了一套簡明易懂的JSON語法用來控制用戶對資源的訪問,類似於身份驗證體系裡的IAM或者網絡安全中的ACL。您可以通過修改權限規則來管理文件權限。

小程序Serverless會為每個新建的文件自動提供一個默認權限規則。默認規則規定所有文件都只有資源所有者可以進行寫操作,所有人可讀。您可以在控制檯上修改文件權限。

1.打開小程序雲控制檯,在雲存儲頁面,單擊權限圖標。
2.修改權限規則,然後單擊保存。
12.jpeg

上面的權限規則由多個子規則組成,每個子規則包含以下信息:

• 範圍:用於定義規則生效範圍。在數據存儲的安全規則中,每一個規則的範圍是一個文件(路徑)。您可以通過文件路徑指定一個特定的文件, 也可以通過JavaScript的正則表達式指代一批文件或使用星號(*)指代所有文件。

• 操作:用於定義生效範圍內的特定操作。所有人都具有文件的讀權限。.write代表寫操作,* 代表所有操作。

• 策略:用於確定生效範圍內的特定操作是否允許。默認沒有標記為允許的操作,都是不允許的。策略是操作是否被允許的標記,可以是一個布爾值,或者是一個表達式。當策略衝突時,以最先出現的規則策略為準。如默認的權限規則策略表達式request.auth.userId == resource.auth.userId代表所有文件都只有資源所有者可以進行寫操作,所有人可讀。

步驟二:雲存儲操作

控制檯操作

1.打開小程序雲控制檯,在雲存儲頁面,單擊上傳文件。
2.單擊直接上傳或將文件拖拽至上傳區域。
文件上傳過程中,請勿刷新或關閉頁面,否則上傳任務會被中斷且列表會被清空。
13.jpeg
3.上傳成功後,您可以單擊詳情查看圖片下載地址。

小程序端調用

1.在小程序項目的根目錄執行以下命令安裝 SDK。

npm install @alicloud/mpserverless-sdk --save

2.文件上傳或刪除。

// 選擇文件上傳
my.chooseImage({
  chooseImage: 1,
  success: res => {
    const path = res.apFilePaths[0];
    const options = {
      filePath: path,
      headers: {
        contentDisposition: 'attachment',
      },
    };

    my.serverless.file.uploadFile(options).then(console.log).catch(console.error);
  },
});
// 刪除之前上傳的文件
my.serverless.file.deleteFile('https://resource.bspapp.com/xxx-xx/4b82ded0-0118-4de4-9f50-ab13110a1ffb.jpg').then(res => {
  console.log(res);
}).catch(err => {
  console.error(err);
});

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top