Table Store支援在查詢資料時使用過濾器在服務端按指定條件進行資料過濾,本文介紹如何在 PHP SDK 中使用過濾器。
前提條件
過濾器類型
Table Store的過濾器類型包括以下 2 種。
單屬性列值過濾器(SingleColumnValueFilter):判斷單個屬性列的值是否符合條件。
組合過濾器(CompositeColumnValueFilter):將多個條件組合進行資料過濾。
單屬性列值過濾器
[
'column_name' => '<string>',
'value' => <ColumnValue>,
'comparator' => <ComparatorType>,
'pass_if_missing' => true || false,
'latest_version_only' => true || false
]範例程式碼
以下範例程式碼以範圍查詢為例查詢主索引值為 [row1, row3) 的行資料,並在查詢後進行過濾,返回 col1 屬性列的值等於 val1 的行資料。
$request = array (
'table_name' => 'test_table',
// 設定查詢起始主鍵
'inclusive_start_primary_key' => array (
array('id', 'row1')
),
// 設定查詢結束主鍵(返回結果不包含結束主鍵)
'exclusive_end_primary_key' => array (
array('id', 'row3')
),
// 設定正向讀取資料
'direction' => DirectionConst::CONST_FORWARD,
// 設定查詢版本
'max_versions' => 1,
// 構造過濾器,條件為 col1 == "val1"
'column_filter' => array (
'column_name' => 'col1',
'value' => 'val1',
'comparator' => ComparatorTypeConst::CONST_EQUAL
)
);
try {
// 調用 getRange 方法讀取行資料
$response = $client->getRange ($request);
// 返回結果處理
echo "* Read CU Cost: " . $response['consumed']['capacity_unit']['read'] . "\n";
echo "* Write CU Cost: " . $response['consumed']['capacity_unit']['write'] . "\n";
echo "* Row Data: " . "\n";
foreach ($response['rows'] as $row) {
echo json_encode($row) . "\n";
}
} catch (Exception $e){
echo "Get Range failed.";
}設定行資料不包含判斷的屬性列時,不返回該行。
$request['column_filter']['pass_if_missing'] = false;設定判斷查詢結果中所有版本的資料,此時只要有一個版本的資料符合條件,即返回該行資料。
$request['column_filter']['latest_version_only'] = false;
組合過濾器
最多支援 32 個條件的組合。
[
'logical_operator' => <LogicalOperator>
'sub_filters' => [
<ColumnFilter>,
<ColumnFilter>,
<ColumnFilter>,
// other conditions
]
]範例程式碼
以下範例程式碼以範圍查詢為例查詢主索引值為 [row1, row3) 的行資料,並使用組合過濾器進行資料過濾。
$request = array (
'table_name' => 'test_table',
// 設定查詢起始主鍵
'inclusive_start_primary_key' => array (
array('id', 'row1')
),
// 設定查詢結束主鍵(返回結果不包含結束主鍵)
'exclusive_end_primary_key' => array (
array('id', 'row3')
),
// 設定正向讀取資料
'direction' => DirectionConst::CONST_FORWARD,
// 設定查詢版本
'max_versions' => 1
);
// 組合條件,判斷條件為 (col1 = val1 or col2 = val2) and (col3 = val3)
$request['column_filter'] = array(
'logical_operator' => LogicalOperatorConst::CONST_AND,
'sub_filters' => array(
array(
'logical_operator' => LogicalOperatorConst::CONST_OR,
'sub_filters' => array(
array(
'comparator' => ComparatorTypeConst::CONST_EQUAL,
'column_name' => 'col1',
'value' => 'val1'
),
array(
'comparator' => ComparatorTypeConst::CONST_EQUAL,
'column_name' => 'col2',
'value' => 'val2'
)
)
),
array(
'comparator' => ComparatorTypeConst::CONST_EQUAL,
'column_name' => 'col3',
'value' => 'val3'
)
)
);
try {
// 調用 getRange 方法讀取行資料
$response = $client->getRange ($request);
// 返回結果處理
echo "* Read CU Cost: " . $response['consumed']['capacity_unit']['read'] . "\n";
echo "* Write CU Cost: " . $response['consumed']['capacity_unit']['write'] . "\n";
echo "* Row Data: " . "\n";
foreach ($response['rows'] as $row) {
echo json_encode($row) . "\n";
}
} catch (Exception $e){
echo "Get Range failed.";
}