使用二級(jí)索引讀取數(shù)據(jù)
表格存儲(chǔ)提供了單行讀取和范圍讀取的查詢方式用于讀取索引表中數(shù)據(jù)。當(dāng)返回的屬性列在索引表中時(shí),您可以直接讀取索引表獲取數(shù)據(jù),否則請(qǐng)自行反查數(shù)據(jù)表獲取數(shù)據(jù)。
前提條件
已初始化Client。具體操作,請(qǐng)參見(jiàn)初始化Client。
已創(chuàng)建二級(jí)索引。具體操作,請(qǐng)參見(jiàn)創(chuàng)建二級(jí)索引。
注意事項(xiàng)
索引表只能用于讀取數(shù)據(jù)。
本地二級(jí)索引表的第一列主鍵必須與數(shù)據(jù)表的第一列主鍵相同。
當(dāng)需要返回的屬性列不在索引表中時(shí),您需要自行反查數(shù)據(jù)表來(lái)獲取數(shù)據(jù)。
單行讀取數(shù)據(jù)
調(diào)用GetRow接口讀取一行數(shù)據(jù)。更多信息,請(qǐng)參見(jiàn)讀取單行數(shù)據(jù)。
參數(shù)
使用GetRow接口讀取索引表中數(shù)據(jù)時(shí)有如下注意事項(xiàng):
tableName需要設(shè)置為索引表名稱。
由于系統(tǒng)會(huì)自動(dòng)將未出現(xiàn)在索引列中的數(shù)據(jù)表主鍵補(bǔ)齊到索引表主鍵中,所以設(shè)置行的主鍵時(shí),需要同時(shí)設(shè)置索引表索引列和補(bǔ)齊的數(shù)據(jù)表主鍵。
示例
使用全局二級(jí)索引
以下示例用于讀取全局二級(jí)索引表中指定主鍵的行數(shù)據(jù)。
var TableStore = require('./index.js');
var Long = TableStore.Long;
var client = require('./client');
var params = {
//設(shè)置索引表名稱。
tableName: "<INDEX_NAME>",
//設(shè)置索引表主鍵信息。
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));
});
使用本地二級(jí)索引
以下示例用于讀取本地二級(jí)索引表中指定主鍵的行數(shù)據(jù)。
var TableStore = require('./index.js');
var Long = TableStore.Long;
var client = require('./client');
var params = {
//設(shè)置索引表名稱。
tableName: "<INDEX_NAME>",
//設(shè)置索引表主鍵信息。索引表的第一列主鍵必須和數(shù)據(jù)表的第一列主鍵相同。
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));
});
范圍讀取數(shù)據(jù)
調(diào)用GetRange接口讀取一個(gè)范圍內(nèi)的數(shù)據(jù)。更多信息,請(qǐng)參見(jiàn)范圍讀取數(shù)據(jù)。
參數(shù)
使用GetRange接口讀取索引表中數(shù)據(jù)時(shí)有如下注意事項(xiàng):
tableName需要設(shè)置為索引表名稱。
由于系統(tǒng)會(huì)自動(dòng)將未出現(xiàn)在索引列中的數(shù)據(jù)表主鍵補(bǔ)齊到索引表主鍵中,所以設(shè)置起始主鍵和結(jié)束主鍵時(shí),需要同時(shí)設(shè)置索引表索引列和補(bǔ)齊的數(shù)據(jù)表主鍵。
示例
使用全局二級(jí)索引
以下示例用于讀取全局二級(jí)索引表中指定主鍵范圍內(nèi)的數(shù)據(jù)。其中第一列主鍵col1的列值為1。
var TableStore = require('./index.js');
var Long = TableStore.Long;
var client = require('./client');
var params = {
//設(shè)置索引表名稱。假定col1是索引表的第一個(gè)主鍵列。pk1和pk2是數(shù)據(jù)表的主鍵,系統(tǒng)會(huì)自動(dòng)將數(shù)據(jù)表的主鍵補(bǔ)齊到索引表的主鍵中。
tableName: "<INDEX_NAME>",
//設(shè)置讀取方向?yàn)檎蜃x取。
direction: TableStore.Direction.FORWARD,
//設(shè)置最大版本數(shù)。
maxVersions: 10,
//設(shè)置起始主鍵和結(jié)束主鍵。主鍵范圍為左閉右開(kāi)的區(qū)間。其中INF_MIN表示無(wú)窮小,INF_MAX表示無(wú)窮大。
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 }],
//設(shè)置最多返回的數(shù)據(jù)行數(shù)。
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不為空,則繼續(xù)讀取數(shù)據(jù)。
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()
使用本地二級(jí)索引
以下示例用于讀取本地二級(jí)索引表中的所有行數(shù)據(jù)。
var TableStore = require('./index.js');
var Long = TableStore.Long;
var client = require('./client');
var params = {
//設(shè)置索引表名稱。假定pk1、col1是索引表的第主鍵列。pk2是數(shù)據(jù)表的主鍵,系統(tǒng)會(huì)自動(dòng)將數(shù)據(jù)表的主鍵補(bǔ)齊到索引表的主鍵中。
tableName: "<INDEX_NAMW>",
//設(shè)置讀取方向?yàn)檎蜃x取。
direction: TableStore.Direction.FORWARD,
//設(shè)置最大版本數(shù)。
maxVersions: 10,
//設(shè)置起始主鍵和結(jié)束主鍵。主鍵范圍為左閉右開(kāi)的區(qū)間。其中INF_MIN表示無(wú)窮小,INF_MAX表示無(wú)窮大。
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 }],
//設(shè)置一次最多返回的數(shù)據(jù)行數(shù)。
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不為空,則繼續(xù)讀取數(shù)據(jù)。
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()