Filtre los resultados de las consultas en el servidor mediante SingleColumnValueFilter o CompositeColumnValueFilter en el SDK de PHP para Tablestore.
Requisitos previos
Antes de empezar, asegúrese de que cuenta con lo siguiente:
Funcionamiento de los filtros
Los filtros se ejecutan en el servidor después de que Tablestore lee las filas que coinciden con el rango de claves primarias, pero antes de devolver los resultados a su aplicación. Dado que la lectura ocurre primero, los filtros no reducen el consumo de unidades de capacidad de lectura (CU). Se cobra a la aplicación por leer todas las filas del rango, sin importar cuántas filas apruebe el filtro. Use los filtros para reducir la transferencia de red y el procesamiento en la aplicación, no para disminuir los costos de lectura.
Si un filtro no reduce significativamente el conjunto de resultados, considere usar un rango de claves primarias más selectivo o un índice secundario.
Tablestore ofrece dos tipos de filtros:
SingleColumnValueFilter: evalúa una sola columna de atributos con respecto a una condición.
CompositeColumnValueFilter: combina hasta 32 condiciones de filtro con los operadores lógicos AND, OR o NOT.
SingleColumnValueFilter
Use SingleColumnValueFilter para filtrar filas según el valor de una columna de atributos.
[
'column_name' => '<string>',
'value' => <ColumnValue>,
'comparator' => <ComparatorType>,
'pass_if_missing' => true || false,
'latest_version_only' => true || false
]
Ejemplo
A continuación se muestra un ejemplo que lee filas con claves primarias en el rango [row1, row3) mediante getRange. Después aplica un filtro para devolver solo las filas donde col1 es igual a val1.
$request = array (
'table_name' => 'test_table',
// Set the start primary key for the range query.
'inclusive_start_primary_key' => array (
array('id', 'row1')
),
// Set the end primary key for the range query. The result does not include this key.
'exclusive_end_primary_key' => array (
array('id', 'row3')
),
// Read data in forward order.
'direction' => DirectionConst::CONST_FORWARD,
// Read the latest version of data.
'max_versions' => 1,
// Return only rows where col1 equals "val1".
'column_filter' => array (
'column_name' => 'col1',
'value' => 'val1',
'comparator' => ComparatorTypeConst::CONST_EQUAL
)
);
try {
// Call getRange to read rows.
$response = $client->getRange ($request);
// Process the response.
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.";
}
-
Para excluir las filas que no contienen la columna de atributos especificada, establezca
pass_if_missingenfalse:$request['column_filter']['pass_if_missing'] = false; -
Para devolver una fila si cualquier versión de la columna de atributos cumple la condición, y no solo la más reciente, establezca
latest_version_onlyenfalse:$request['column_filter']['latest_version_only'] = false;
CompositeColumnValueFilter
Use CompositeColumnValueFilter para combinar hasta 32 condiciones de filtro con operadores lógicos.
[
'logical_operator' => <LogicalOperator>
'sub_filters' => [
<ColumnFilter>,
<ColumnFilter>,
<ColumnFilter>,
// other conditions
]
]
Ejemplo
El siguiente ejemplo lee filas con claves primarias en el rango [row1, row3) y aplica un filtro compuesto con la condición (col1 = val1 OR col2 = val2) AND (col3 = val3).
$request = array (
'table_name' => 'test_table',
// Set the start primary key for the range query.
'inclusive_start_primary_key' => array (
array('id', 'row1')
),
// Set the end primary key for the range query. The result does not include this key.
'exclusive_end_primary_key' => array (
array('id', 'row3')
),
// Read data in forward order.
'direction' => DirectionConst::CONST_FORWARD,
// Read the latest version of data.
'max_versions' => 1
);
// Combine conditions: (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 {
// Call getRange to read rows.
$response = $client->getRange ($request);
// Process the response.
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.";
}