开发者社区> 问答> 正文

NodeJS-SDK的多行数据操作

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

批量读(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[0].tableName, primaryKey: [] };
            for (var j = 0; j < data.tables.length; j++) {
                if (!data.tables[j].isOk && null != data.tables[j].primaryKey) {
                    isAllSuccess = false;
                    var pks = [];
                    for (var k in data.tables[j].primaryKey) {
                        var name = data.tables[j].primaryKey[k].name;
                        var value = data.tables[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);


[backcolor=transparent]说明:
  • 批量读也支持通过条件语句过滤。
  • 详细代码可在 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: 'PUT',
            condition: new TableStore.Condition(TableStore.RowExistenceExpectation.IGNORE, null),
            primaryKey: [{ 'gid': Long.fromNumber(8) }, { 'uid': Long.fromNumber(80) }],
            attributeColumns: [{ 'attrCol1': 'test1' }, { 'attrCol2': 'test2' }],
            returnContent: { returnType: TableStore.ReturnType.Primarykey }
        }],
    }],
};
client.batchWriteRow(params, function (err, data) {
    if (err) {
        console.log('error:', err);
        return;
    }
    console.log('success:', data);
});


[backcolor=transparent]说明:


范围读(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);
});


[backcolor=transparent]说明:
  • 按范围读也支持通过条件语句过滤。
  • 按范围读需要注意数据可能会分页。
  • 详细代码可在 GetRange@GitHub 获取。

展开
收起
云栖大讲堂 2017-10-25 16:37:36 2139 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
探究 Node.js 的服务端之路 立即下载
个推微服务实践 基于OpenResty 和Node.js 立即下载
沪江基于Node.js大规模应用实践 立即下载