Resolución de claves incrustadas en JSON

Hoy ha surgido una pregunta de un desarrollador que quería migrar a Couchbase desde otra cosa. Ese "algo más" tenía un documento JSON con algunos metadatos. Couchbase separa los datos de los metadatos por algunas buenas razones, así que tendríamos que eliminar este campo "_id". Afortunadamente es bastante fácil escribir un método de extensión para hacer esto con el SDK de .NET o si estás usando POCOs (Plan Ole' Csharp Objects), usar un ContractResolver personalizado.

El escenario

Suponga que tiene un documento parecido a éste, quizás almacenado en disco:

Lo que quieres hacer es eliminar el id del propio documento y convertirlo en la clave del documento que insertarás en Couchbase. Una vez hecho esto habrá dos documentos almacenados en Couchbase: el propio documento y los metadatos del documento.

¿Metadatos del documento? ¿Contenido? ¿Cuál es la diferencia?

Metadatos son datos sobre el propio documento, pero no sobre su contenido. Contiene los siguientes valores:

  • TTL - fecha de caducidad del documento
  • CAS - comparar e intercambiar valores para garantizar una concurrencia optimista en una clave
  • Banderas - Metadatos específicos del SDK para la transcodificación
  • Número de secuencia - un valor utilizado internamente en Couchbase para la resolución de conflictos para claves que se actualizan en diferentes clusters - cosa de replicación entre centros de datos (XDCR)
  • Clave - el identificador único del propio documento

Toda esta información es útil fuera del propio contenido, tan importante que se separa y persiste en memoria. El tamaño de los metadatos varía entre las versiones de Couchbase; a partir de la 2.1.0 es de 54k, que es bastante pequeño. Ahora el contenido del documento, es el propio JSON o datos binarios.

Uso de resolvedores de contratos personalizados con métodos de extensión

Hay dos cosas que tenemos que hacer: obtener el valor clave para el "_id" del documento y en segundo lugar es asegurarse de que durante la serialización que el valor "_id" no se persiste con el contenido. Lo primero requiere que analicemos la cadena JSON y extraigamos el "_Id" para luego asignarlo al nuevo documento que insertaremos en Couchbase. Esto último puede hacerse de dos maneras: usando un ContractResolver personalizado o manipulando el JSON como un JObject en sí mismo. Resulta que, para soportar tanto POCO's como la palabra clave dinámica, necesitas hacer ambas cosas.

El IgnoreFieldContractResolver

El SDK .NET de Couchbase utiliza por defecto el método Marco JSON de NewtonSoft para .NET. Cuando está configurando su cliente, hay un gancho para asignar un resolvedor de contratos personalizado. Un contrato resuelve de los campos de su JSON a su modelo de objetos. Un resolver personalizado le permite hacer cosas como ignorar o modificar los campos dentro de su JSON ... funciona como una especie de filtro.

Este es el listado para un resolver personalizado que ignora cualquier nombre de campo que le pases al constructor:

No hay mucho que hacer aquí, básicamente estamos derivando de DefaultContractResolver y sobreescribiendo el método CreateProperties. En este caso estamos omitiendo el JsonProperty que es el nombre del campo FieldToIgnore de ser serializado. Si ahora configuras el ClientConfiguration para usarlo, así:

Entonces todos los documentos JSON que se serialicen tendrán su FieldToIgnore despojado; en nuestro caso usamos el campo "_id", ya que no queremos que persista (ya que se convertirá en la clave de metadatos).

Extracción del Id e inserción del JSON con un método de extensión

Ahora que tenemos un resolvedor de contratos que eliminará el campo "_id" de cualquier JSON que insertemos usando el cliente, podemos extraer el id del documento (el valor de "_id") y usarlo como clave para la inserción.

Ten en cuenta que hay dos casos (principales) para almacenar JSON (desde una perspectiva SDK) en Couchbase. Puedes almacenar un POCO que represente el documento JSON o puedes insertar el documento JSON como un Type dinámico. Cada uno requiere una consideración especial, pero es bastante fácil escribir un método de extensión que abstraiga esto:

La consideración "especial" aquí para los tipos dinámicos es que no se puede confiar en la reflexión sobre T, ya que T será un objeto. Necesita crear primero un JObject y luego usarlo para obtener el valor de "_id".

Una vez que tengas este método de extensión en su lugar, puedes escribir código simple como este para extraer un archivo JSON del disco, extraer la clave e insertarla en Couchbase:

Fíjese que para el POCO usted apunta al campo "Id" y para el dinámico apunta a "_id", esto es simplemente porque para el dinámico sacamos el valor directamente del JObject, por lo tanto reflejará el casing y las convenciones del JSON original.

Ahora si miras el documento JSON en Couchbase Managment Console, verás que el campo "_id" fue eliminado del documento y usado para la clave:

Conseguir la fuente:

Si quieres jugar con la fuente que utilicé para este post, está en laboratorios couchbase en Github. La intención del proyecto (couchbase-net-contrib) es proporcionar extensiones y plugins que se utilizan comúnmente cuando se trabaja con el SDK de Couchbase, pero que probablemente no se incluirán en el SDK actual. Está pensado para ser impulsado por la comunidad, ¡así que siéntete libre de enviar un pull request con cualquier contribución que creas que puede ser útil para otros!

Comparte este artículo
Recibe actualizaciones del blog de Couchbase en tu bandeja de entrada
Este campo es obligatorio.

Autor

Publicado por Jeff Morris, Ingeniero Superior de Software, Couchbase

Jeff Morris es Ingeniero de Software Senior en Couchbase. Antes de unirse a Couchbase, Jeff pasó seis años en Source Interlink como Arquitecto Web Empresarial. Jeff es responsable del desarrollo de los SDK de Couchbase y de cómo integrarse con N1QL (lenguaje de consulta).

Deja un comentario

¿Listo para empezar con Couchbase Capella?

Empezar a construir

Consulte nuestro portal para desarrolladores para explorar NoSQL, buscar recursos y empezar con tutoriales.

Utilizar Capella gratis

Ponte manos a la obra con Couchbase en unos pocos clics. Capella DBaaS es la forma más fácil y rápida de empezar.

Póngase en contacto

¿Quieres saber más sobre las ofertas de Couchbase? Permítanos ayudarle.