使用二级索引读取数据

表格存储提供了单行读取和范围读取的查询方式用于读取索引表中数据。当返回的属性列在索引表中时,您可以直接读取索引表获取数据,否则请自行反查数据表获取数据。

前提条件

注意事项

  • 索引表只能用于读取数据。

  • 本地二级索引表的第一列主键必须与数据表的第一列主键相同。

  • 当需要返回的属性列不在索引表中时,您需要自行反查数据表来获取数据。

单行读取数据

调用GetRow接口读取一行数据。更多信息,请参见读取单行数据

参数

使用GetRow接口读取索引表中数据时有如下注意事项:

  • tableName需要设置为索引表名称。

  • 由于系统会自动将未出现在索引列中的数据表主键补齐到索引表主键中,所以设置行的主键时,需要同时设置索引表索引列和补齐的数据表主键。

示例

使用全局二级索引

以下示例用于读取全局二级索引表中指定主键的行数据。

var TableStore = require('./index.js');
var Long = TableStore.Long;
var client = require('./client');

var params = {
  //设置索引表名称。
  tableName: "<INDEX_NAME>",  
  //设置索引表主键信息。
  primaryKey: [{ 'col1': Long.fromNumber(2) }, { 'pk1': Long.fromNumber(2) }, { 'pk2': Long.fromNumber(1) }]
};

client.getRow(params, function (err, data) {
  if (err) {
    console.log('error:', err);
    return;
  }
  console.log('success:', JSON.stringify(data.row, null, 2));
});

使用本地二级索引

以下示例用于读取本地二级索引表中指定主键的行数据。

var TableStore = require('./index.js');
var Long = TableStore.Long;
var client = require('./client');

var params = {
  //设置索引表名称。
  tableName: "<INDEX_NAME>", 
  //设置索引表主键信息。索引表的第一列主键必须和数据表的第一列主键相同。
  primaryKey: [{ 'pk1': Long.fromNumber(1) }, { 'col1': Long.fromNumber(2) }, { 'pk2': Long.fromNumber(2) }]
};

client.getRow(params, function (err, data) {
  if (err) {
    console.log('error:', err);
    return;
  }
  console.log('success:', JSON.stringify(data.row, null, 2));
});

范围读取数据

调用GetRange接口读取一个范围内的数据。更多信息,请参见范围读取数据

参数

使用GetRange接口读取索引表中数据时有如下注意事项:

  • tableName需要设置为索引表名称。

  • 由于系统会自动将未出现在索引列中的数据表主键补齐到索引表主键中,所以设置起始主键和结束主键时,需要同时设置索引表索引列和补齐的数据表主键。

示例

使用全局二级索引

以下示例用于读取全局二级索引表中指定主键范围内的数据。其中第一列主键col1的列值为1。

var TableStore = require('./index.js');
var Long = TableStore.Long;
var client = require('./client');

var params = {
  //设置索引表名称。假定col1是索引表的第一个主键列。pk1和pk2是数据表的主键,系统会自动将数据表的主键补齐到索引表的主键中。
  tableName: "<INDEX_NAME>", 
  //设置读取方向为正序读取。
  direction: TableStore.Direction.FORWARD,
  //设置最大版本数。
  maxVersions: 10,
  //设置起始主键和结束主键。主键范围为左闭右开的区间。其中INF_MIN表示无穷小,INF_MAX表示无穷大。
  inclusiveStartPrimaryKey: [{ "col1": Long.fromNumber(1) }, { "pk1": TableStore.INF_MIN }, { "pk2": TableStore.INF_MIN }],
  exclusiveEndPrimaryKey: [{ "col1": Long.fromNumber(1) }, { "pk1": TableStore.INF_MAX }, { "pk2": 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 = [
        { "col1": data.nextStartPrimaryKey[0].value },
        { "pk1": data.nextStartPrimaryKey[1].value },
        { "pk2": data.nextStartPrimaryKey[2].value }
      ];
      getRange()
    } else {
      console.log(JSON.stringify(resultRows));
    }
  });
}

getRange()

使用本地二级索引

以下示例用于读取本地二级索引表中的所有行数据。

var TableStore = require('./index.js');
var Long = TableStore.Long;
var client = require('./client');

var params = {
  //设置索引表名称。假定pk1、col1是索引表的第主键列。pk2是数据表的主键,系统会自动将数据表的主键补齐到索引表的主键中。
  tableName: "<INDEX_NAMW>", 
  //设置读取方向为正序读取。
  direction: TableStore.Direction.FORWARD,
  //设置最大版本数。
  maxVersions: 10,
  //设置起始主键和结束主键。主键范围为左闭右开的区间。其中INF_MIN表示无穷小,INF_MAX表示无穷大。
  inclusiveStartPrimaryKey: [{ "pk1": TableStore.INF_MIN }, { "col1": TableStore.INF_MIN }, { "pk2": TableStore.INF_MIN }],
  exclusiveEndPrimaryKey: [{ "pk1": TableStore.INF_MAX }, { "col1": TableStore.INF_MAX }, { "pk2": 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 = [
        { "pk1": data.nextStartPrimaryKey[0].value },
        { "col1": data.nextStartPrimaryKey[1].value },
        { "pk2": data.nextStartPrimaryKey[2].value }
      ];
      getRange()
    } else {
      console.log(JSON.stringify(resultRows));
    }
  });
}

getRange()

常见问题

相关文档

  • 当日常业务中有非主键列查询、多列组合查询、模糊查询等多维查询需求以及求最值、统计行数、数据分组等数据分析需求时,您可以将这些属性作为多元索引中的字段并使用多元索引查询与分析数据。 更多信息,请参见多元索引

  • 如果需要使用SQL查询和分析数据,您可以使用SQL查询功能实现。更多信息,请参见SQL查询