在資料表上建立索引表後,可根據需要讀取索引表中的資料或者刪除資料表上指定的索引表。

前提條件

  • 已初始化Client。具體操作,請參見初始化
  • 已建立資料表,且資料表的資料生命週期(timeToLive)必須為-1,最大版本數(maxVersions)必須為1。
  • 資料表已設定預定義列。

建立索引表(CreateIndex)

使用CreateIndex介面在已存在的資料表上建立索引表。
说明 您也可以使用CreateTable介面在建立資料表的同時建立一個或者多個索引表。具體操作,請參見建立資料表
  • 參數
    參數說明
    mainTableName資料表名稱。
    indexMeta 索引表的結構資訊,包括如下內容:
    • name:索引表名稱。
    • primaryKey:索引表的索引列,索引列為資料表主鍵和預定義列的組合。

      使用本地二級索引時,索引表的第一個主鍵列必須與資料表的第一個主鍵列相同。

    • definedColumn:索引表的屬性列,索引表屬性列為資料表的預定義列的組合。
    • includeBaseData:索引表中是否包含資料表中已存在的資料。

      當設定includeBaseData為true時,表示包含存量資料;設定includeBaseData為false時,表示不包含存量資料。

    • indexType:索引類型。可選值包括IT_GLOBAL_INDEX和IT_LOCAL_INDEX。
      • 當不設定indexType或者設定indexType為IT_GLOBAL_INDEX時,表示使用全域二級索引。

        使用全域索引時,Table Store以非同步方式將資料表中被索引的列和主鍵列的資料自動同步到索引表中,正常情況下同步延遲達到毫秒層級。

      • 當設定indexType為IT_LOCAL_INDEX時,表示使用本地二級索引。

        使用本地二級索引時,Table Store以同步方式將資料表中被索引的列和主鍵列的資料自動同步到索引表中,當資料寫入資料表後,即可從索引表中查詢到資料。

    • indexUpdateMode:索引更新模式。可選值包括IUM_ASYNC_INDEX和IUM_SYNC_INDEX。
      • 當不設定indexUpdateMode或者設定indexUpdateMode為IUM_ASYNC_INDEX時,表示非同步更新。

        使用全域二級索引時,索引更新模式必須設定為非同步更新(IUM_ASYNC_INDEX)。

      • 當設定indexUpdateMode為IUM_SYNC_INDEX時,表示同步更新。

        使用本地二級索引時,索引更新模式必須設定為同步更新(IUM_SYNC_INDEX)。

  • 樣本
    var client = require('./client');
    var TableStore = require('../index.js');
    
    client.createIndex({
        mainTableName: "sdkGlobalIndexTest",
        indexMeta: {
            name: "sdkGlobalIndex",
            primaryKey: ["col1"],
            definedColumn: ["col2"],
            includeBaseData: false,
            indexUpdateMode: TableStore.IndexUpdateMode.IUM_ASYNC_INDEX,//索引更新模式預設為非同步更新(IUM_ASYNC_INDEX)。
            indexType: TableStore.IndexType.IT_GLOBAL_INDEX,//索引類型預設為全域二級索引(IT_GLOBAL_INDEX)。
        }
    }, function (err, data) {
        if (err) {
            console.log('error:', err);
            return;
        }
        console.log('success:', JSON.stringify(data, null, 2));
    });

讀取索引表中資料

從索引表中單行或者範圍讀取資料,當返回的屬性列在索引表中時,可以直接讀取索引表擷取資料,否則請自行反查資料表擷取資料。

  • 單行讀取索引表中資料

    更多資訊,請參見讀取單行資料

    • 參數
      使用GetRow介面讀取索引表中資料時有如下注意事項:
      • tableName需要設定為索引表名稱。
      • 由於系統會自動將未出現在索引列中的資料表主鍵補齊到索引表主鍵中,所以設定行的主鍵時,需要同時設定索引表索引列和補齊的資料表主鍵。
    • 樣本
      var TableStore = require('../index.js');
      var Long = TableStore.Long;
      var client = require('./client');
      
      var params = {
        tableName: "index1",
        primaryKey: [ {'pk2': Long.fromNumber(2)}, {'pk1': Long.fromNumber(1)}]
      };
      
      client.getRow(params, function (err, data) {
        if (err) {
          console.log('error:', err);
          return;
        }
        console.log('success:', JSON.stringify(data, null, 2));
      });
  • 範圍讀索引表中資料

    更多資訊,請參見範圍讀取資料

    • 參數
      使用GetRange介面讀取索引表中資料時有如下注意事項:
      • tableName需要設定為索引表名稱。
      • 由於系統會自動將未出現在索引列中的資料表主鍵補齊到索引表主鍵中,所以設定起始主鍵和結束主鍵時,需要同時設定索引表索引列和補齊的資料表主鍵。
    • 樣本
      var TableStore = require('../index.js');
      var Long = TableStore.Long;
      var client = require('./client');
      
      var params = {
        tableName: "sdkIndex1", //假定pk2是索引表的第一個主鍵列,pk1是索引表的第二個主鍵列。
        direction: TableStore.Direction.FORWARD,
        maxVersions: 10,
        inclusiveStartPrimaryKey: [{ "pk2": TableStore.INF_MIN }, { "pk1": TableStore.INF_MIN }],
        exclusiveEndPrimaryKey: [{ "pk2": TableStore.INF_MAX }, { "pk1": TableStore.INF_MAX }],
        limit: 2
      };
      
      var resultRows = []
      
      var getRange = function () {
        client.getRange(params, function (err, data) {
          if (err) {
            console.log('error:', err);
            return;
          }
          resultRows = resultRows.concat(data.rows)
      
          //如果data.next_start_primary_key不為空白,則繼續讀取。
          if (data.nextStartPrimaryKey) {
            params.inclusiveStartPrimaryKey = [
              { "pk2": data.nextStartPrimaryKey[0].value },
              { "pk1": data.nextStartPrimaryKey[1].value }
            ];
            getRange()
          } else {
            console.log(JSON.stringify(resultRows));
          }
        });
      }
      
      getRange()

刪除索引表(DeleteIndex)

使用DeleteIndex介面刪除資料表上指定的索引表。

  • 參數
    參數說明
    mainTableName資料表名稱。
    indexName索引表名稱。
  • 樣本
    var client = require('./client');
    
    client.dropIndex({
      mainTableName: "sdkGlobalTest",
      indexName: "sdkIndex1"
    }, function (err, data) {
      if (err) {
        console.log('error:', err);
        return;
      }
      console.log('success:', JSON.stringify(data, null, 2));
    });