iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 22
1

上一篇稍微看過了 Azure Cosmos DB 的簡單操作後,這一篇會來講解它的大致結構,可參考下圖:

https://ithelp.ithome.com.tw/upload/images/20181102/20112426pH8epMIjCX.png

每個 Azure 帳號可以創建多個 database,每個 database 可以包含多個 collections,在 collections 中包含多個 documents。而在 collection 中可以加入 stored procedures、triggers、User Defined Functions(UDFs) 等等。

我們先手動在 Data Explorer 介面上創建一個 TestDBFruits collection。
https://ithelp.ithome.com.tw/upload/images/20181102/20112426uC3DoPg0UZ.png

插入資料到資料庫

接著我們使用程式插入一筆資料試試:

yarn add @azure/cosmos
const cosmos = require('@azure/cosmos');
const CosmosClient = cosmos.CosmosClient;

const endpoint = "填上 443 port 的 DB Endpoint";
const masterKey = "填上金鑰";
const client = new CosmosClient({ endpoint, auth: { masterKey } });

const databaseDefinition = { id: 'TestDB' };
const collectionDefinition = { id: 'Fruits' };
const documentDefinition = { name: 'Green Apple', category: 'Apple', data: Date.now() };

async function createFruit() {
  const { body } = await client.database(databaseDefinition.id).container(collectionDefinition.id).items.create(documentDefinition);
  console.log('Created item with content');
}

createFruit().catch(err => {
  console.error(err);
});

點進去 Data explorer 的 Document 後可以看到剛才新增的資料如下:

https://ithelp.ithome.com.tw/upload/images/20181102/20112426IWH0FssgSp.png

document 結構

接著我們要來講一下每個欄位的意思:

_rid 由系統產生的唯一值,並且有順序性,例如上一筆插入的資料此欄位值為 `SvJDANLJWUiBhB4AAAAAAA==` 則下一筆會是 `SvJDANLJWUiChB4AAAAAAA==`

_etag 由系統產生, 用來優化 concurrency

_ts 由系統產生,當作最後一次更新的 timestamp

_self 由系統產生,代表資源的一個 URI,通常為此種格式 `/dbs/{dbName}/users/{userId}/permissions/{permissionId}`

id 可以由使用者自行設定,如果沒有設定系統會自動產生。

我們使用 Node.js SDK 時可以如下使用:

初始化連線:

const client = new CosmosClient({ endpoint: endpoint, auth: { masterKey: masterKey } });

創建資料庫:

const { database } = await client.databases.createIfNotExists({ id: databaseId });

建立 collection:

const { container } = await client.database(databaseId).containers.createIfNotExists({ id: containerId });

執行 SQL

const querySpec = {
    query: "SELECT VALUE r.children FROM root r WHERE r.lastName = @lastName",
    parameters: [
        {
            name: "@lastName",
            value: "Andersen"
        }
    ]
};

const { result: results } = await client.database(databaseId).container(containerId).items.query(querySpec).toArray();
for (var queryResult of results) {
    let resultString = JSON.stringify(queryResult);
    console.log(`\tQuery returned ${resultString}\n`);
}

參考資料:https://docs.microsoft.com/en-us/azure/cosmos-db/sql-api-resources


上一篇
21. 使用 Azure Cosmos DB(1)簡介與範例
下一篇
23. 使用 Azure Cosmos DB(3)一致性策略與 DB replicate
系列文
Azure Service 實作 ( Blockchain、AI、 Serverless Architecture)30

尚未有邦友留言

立即登入留言