表格存储提供了BatchGetRow、BatchWriteRow、GetRange等多行操作的接口。

批量读(BatchGetRow)

批量读取一个或多个表中的若干行数据。

BatchGetRow操作可视为多个GetRow操作的集合,各个操作独立执行,独立返回结果,独立计算服务能力单元。

与执行大量的GetRow操作相比,使用BatchGetRow操作可以有效减少请求的响应时间,提高数据的读取速率。

  • 接口
      /**
       * 批量读取一个或多个表中的若干行数据。
       */
      batchGetRow(params, callback)
    					
  • 示例

    批量一次读多个表、多行,单行出错时进行重试。

    说明 批量读也支持通过条件语句过滤。
    var client = require('./client');
    var TableStore = require('../index.js');
    var Long = TableStore.Long;
    
    var params = {
        tables: [{
            tableName: 'sampleTable',
            primaryKey: [
                [{ 'gid': Long.fromNumber(20013) }, { 'uid': Long.fromNumber(20013) }],
                [{ 'gid': Long.fromNumber(20015) }, { 'uid': Long.fromNumber(20015) }]
            ],
            startColumn: "col2",
            endColumn: "col4"
        },
        {
            tableName: 'notExistTable',
            primaryKey: [
                [{ 'gid': Long.fromNumber(10001) }, { 'uid': Long.fromNumber(10001) }]
            ]
        }
        ],
    };
    
    var maxRetryTimes = 3;
    var retryCount = 0;
    
    function batchGetRow(params) {
        client.batchGetRow(params, function (err, data) {
            if (err) {
                console.log('error:', err);
                return;
            }
    
            var isAllSuccess = true;
            var retryRequest = { tables: [] };
            for (var i = 0; i < data.tables.length; i++) {
                var faildRequest = { tableName: data.tables[i][0].tableName, primaryKey: [] };
    
                for (var j = 0; j < data.tables[i].length; j++) {
                    if (!data.tables[i][j].isOk && null != data.tables[i][j].primaryKey) {
                        isAllSuccess = false;
                        var pks = [];
                        for (var k in data.tables[i][j].primaryKey) {
                            var name = data.tables[i][j].primaryKey[k].name;
                            var value = data.tables[i][j].primaryKey[k].value;
                            var kp = {};
                            kp[name] = value;
                            pks.push(kp);
                        }
                        faildRequest.primaryKey.push(pks);
    
                    } else {
                        // get success data
                    }
                }
    
                if (faildRequest.primaryKey.length > 0) {
                    retryRequest.tables.push(faildRequest);
                }
            }
    
            if (!isAllSuccess && retryCount++ < maxRetryTimes) {
                batchGetRow(retryRequest);
            }
    
            console.log('success:', data);
        });
    }
    
    batchGetRow(params, maxRetryTimes);
    
    					

    详细代码请参见BatchGetRow@GitHub

批量写(BatchWriteRow)

批量插入、修改或删除一个或多个表中的若干行数据。

BatchWriteRow操作可视为多个PutRow、UpdateRow、DeleteRow操作的集合,各个操作独立执行,独立返回结果,独立计算服务能力单元。

  • 接口
      /**
       * 批量修改行。
       */
      batchWriteRow(params, callback)
    					
  • 示例

    批量写入数据。

    说明 批量写也支持通过条件语句过滤。
    var client = require('./client');
    var TableStore = require('../index.js');
    var Long = TableStore.Long;
    
    var params = {
    
        tables: [
            {
                tableName: 'sampleTable',
                rows: [
                    {
                        type: 'UPDATE',
                        condition: new TableStore.Condition(TableStore.RowExistenceExpectation.IGNORE, null),
                        primaryKey: [{ 'gid': Long.fromNumber(20010) }, { 'uid': Long.fromNumber(20010) }],
                        attributeColumns: [{ 'PUT': [{ 'col1': 'test3' }, { 'col2': 'test4' }] }],
                        returnContent: { returnType: 1 }
                    },
                    {
                        type: 'PUT',
                        condition: new TableStore.Condition(TableStore.RowExistenceExpectation.IGNORE, null),
                        primaryKey: [{ 'gid': Long.fromNumber(20020) }, { 'uid': Long.fromNumber(20020) }],
                        attributeColumns: [{ 'col1': 'test1' }, { 'col2': 'test2' }],
                        returnContent: { returnType: TableStore.ReturnType.Primarykey }
                    },
                    {
                        type: 'DELETE',
                        condition: new TableStore.Condition(TableStore.RowExistenceExpectation.IGNORE, null),
                        primaryKey: [{ 'gid': Long.fromNumber(20018) }, { 'uid': Long.fromNumber(20018) }],
                    }
                ]
            }
        ],
    };
    
    client.batchWriteRow(params, function (err, data) {
    
        if (err) {
            console.log('error:', err);
            return;
        }
    
        console.log('success:', data);
    });
    
    					

    详细代码请参见BatchWriteRow@GitHub

范围读(GetRange)

读取指定主键范围内的数据。

  • 接口
      /**
       * 读取指定主键范围内的数据。
       */
      getRange(params, callback)
    					
  • 示例

    按照范围读取数据。

    说明
    • 按范围读取也支持通过条件语句过滤。
    • 按范围读取需要注意数据可能会分页。
    var Long = TableStore.Long;
    var client = require('./client');
    
    var params = {
      tableName: "sampleTable",
      direction: TableStore.Direction.FORWARD,
      inclusiveStartPrimaryKey: [{ "gid": TableStore.INF_MIN }, { "uid": TableStore.INF_MIN }],
      exclusiveEndPrimaryKey: [{ "gid": TableStore.INF_MAX }, { "uid": TableStore.INF_MAX }],
      limit: 50
    };
    
    client.getRange(params, function (err, data) {
      if (err) {
        console.log('error:', err);
        return;
      }
    
    //如果data.next_start_primary_key不为空,说明需要继续读取。
      if (data.next_start_primary_key) {
    
      }
    
      console.log('success:', data);
    });
    
    					

    详细代码请参见GetRange@GitHub