Para apoyar el próximo lanzamiento de Couchbase Server 4.5 y algunas innovaciones en la comunidad PHP con PHP 7, estamos mejorando nuestro PHP SDK. Hoy me gustaría anunciar la tercera Beta, que trae un par de nuevas funcionalidades junto con correcciones y mejoras internas. En esta entrada de blog demostraremos algunas de ellas.
API de subdocumentos
Nosotros ya escribió anteriormente sobre esta APIpero esta vez vamos a mostrar algo de PHP. Asumimos que has instalado Couchbase 4.5 beta como mínimo y has configurado el bucket de ejemplo mejorado viaje-muestra. Primero vamos a hacer un poco de código de servicio, donde instanciamos una conexión a bucket, y también definimos una función de utilidad para informar sobre un hotel al azar.
|
1 2 3 4 5 6 7 8 9 |
$cluster = new CouchbaseCluster('couchbase://localhost'); $bucket = $cluster->openBucket('travel-sample'); function report($name, $publicLikes, $firstServiceRating) { printf("Hotel "%s" has %d public likes. First rating for Service is %dn", $name, count($publicLikes), $firstServiceRating); } |
Bien, ya estamos listos. La API de subdocumentos permite ahorrar tráfico de red al trabajar con documentos de gran tamaño mediante un control detallado; por ejemplo, podemos extraer algunas de las propiedades del archivo hotel_10025:
|
1 2 3 4 5 6 7 8 |
$res = $bucket->lookupIn('hotel_10025') ->get('name') ->get('public_likes') ->get('reviews[0].ratings.Service') ->execute(); report($res->value[0]['value'], $res->value[1]['value'], $res->value[2]['value']); // => Hotel "Medway Youth Hostel" has 8 public likes. First rating for Service is 5 |
Aquí y los métodos de acceso posteriores aceptan la ruta como primer argumento. Esto es similar a la ruta N1QL como se describe en la documentación. Si obtiene este documento utilizando la API normal, verá que no es el más pequeño y que contiene mucha información sobre el lugar, y con buscarEn sólo transfieres los datos que te interesan. Esto es más importante cuando quieres modificar pequeñas partes de un documento enorme. Por ejemplo, añadamos una persona más a me gusta_público, ajuste el nombre del hotel y elimine una de las valoraciones.
|
1 2 3 4 5 6 |
$bucket->mutateIn('hotel_10025') ->replace('name', 'Medway Adult Hostel') ->arrayAppend('public_likes', 'John Doe') ->remove('reviews[0]') ->execute(); |
El código se explica por sí mismo. Si desea utilizar bloqueo optimistabasta con pasar el valor CAS como segundo argumento a mutateIn. La lista completa de operadores de mutación se encuentra en la referencia API https://docs.couchbase.com/sdk-api/couchbase-php-client-2.2.0beta3/classes/CouchbaseMutateInBuilder.html. Vamos a mostrar lo que tenemos después del cambio, pero esta vez vamos a utilizar el acceso directo para buscarEn con múltiples consiga operadores:
|
1 2 3 4 5 |
$res = $bucket->retrieveIn('hotel_10025', 'name', 'public_likes', 'reviews[0].ratings.Service'); report($res->value[0]['value'], $res->value[1]['value'], $res->value[2]['value']); // => Hotel "Medway Youth Hostel" has 9 public likes. First rating for Service is 3 |
Gestión de índices
Anteriormente, para listar, crear o eliminar índices, era necesario elaborar manualmente la sentencia N1QL. En el próximo SDK de PHP 2.2 habrá una nueva API que simplificará esta tarea mediante la exposición de prácticas funciones en Gestor de cuboscomo en Couchbase Views. Veamos qué índices están definidos en el archivo viaje-muestra por defecto:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$manager = $bucket->manager(); $res = $manager()->listN1qlIndexes(); foreach ($res as $index) { printf("Index %s.%s", $index->keyspace, $index->name); if ($index->condition) { printf("ntwith condition: %s", $index->condition); } if (count($index->fields) > 0) { printf("nton fields: %s", join(', ', $index->fields)); } printf("n"); } |
Debería salir algo como esto:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Index travel-sample.def_primary Index travel-sample.def_airportname on fields: `airportname` Index travel-sample.def_city on fields: `city` Index travel-sample.def_faa on fields: `faa` Index travel-sample.def_icao on fields: `icao` Index travel-sample.def_name_type with condition: (`_type` = "User") on fields: `name` Index travel-sample.def_route_src_dst_day with condition: (`type` = "route") on fields: `sourceairport`, `destinationairport`, (distinct (array (`v`.`day`) for `v` in `schedule` end)) Index travel-sample.def_schedule_utc on fields: array (`s`.`utc`) for `s` in `schedule` end Index travel-sample.def_sourceairport on fields: `sourceairport` Index travel-sample.def_type on fields: `type` |
El siguiente ejemplo demuestra la creación de índices sobre nombre:
|
1 2 3 4 |
$manager->createN1qlPrimaryIndex(); $manager->createN1qlIndex('ex_name', array('name')); $manager->createN1qlIndex('ex_srcdst, array('sourceairport','destinationairport'), '`type` = "route"`); |
Eliminar índices no es un poco más difícil:
|
1 2 3 |
$manager->dropN1qlPrimaryIndex(); $manager->dropN1qlIndex('ex_name'); |
Antes de terminar, me gustaría mostrar un pequeño pero en algunos casos importante cambio que hemos conseguido en la versión beta3. El valor CAS siempre ha sido opaco en el protocolo de Couchbase, así como en los SDKs, pero en PHP estaba incluso oculto para los desarrolladores de aplicaciones detrás de la referencia de recursos PHP, lo que significa que es difícil pasarlo fácilmente (por ejemplo, para renderizar en una página HTML). En esta versión codificamos el CAS como un token de cadena, por lo que sigue siendo opaco, pero mucho más fácil de serializar.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
$res = $bucket->get('airline_10'); var_dump($res); //=> object(CouchbaseMetaDoc)#5 (4) { // ["error"]=> // NULL // ["value"]=> // object(stdClass)#4 (7) { // ["id"]=> // int(10) // ["type"]=> // string(7) "airline" // ["name"]=> // string(11) "40-Mile Air" // ["iata"]=> // string(2) "Q5" // ["icao"]=> // string(3) "MLA" // ["callsign"]=> // string(8) "MILE-AIR" // ["country"]=> // string(13) "United States" // } // ["flags"]=> // int(33554438) // ["cas"]=> // string(11) "jq25pb4ckd0" // } |
Si no está familiarizado con lo que es el CAS, puede aprenderlo con un ejemplo aquí: https://github.com/couchbase/php-couchbase/blob/master/examples/cas/cas_replace.php
Y por último, para instalar esta versión, utilice el siguiente comando (asegúrese de tener libcouchbase 2.6.0+ instalado):
|
1 2 |
pecl install couchbase-2.2.0beta3 |
Esto es todo por ahora. Planeamos una versión Beta más antes de GA con aún más características. Si encuentras algún problema, por favor envíalo directamente al sitio de Comunidades Couchbase en https://www.couchbase.com/community/. Además, los errores pueden notificarse directamente a través de nuestro gestor de incidencias disponible aquí: https://www.couchbase.com/issues/browse/PCBC/
Permanezca atento.