ask.js

Bueno, hace tiempo que no hay actividad por el blog pero vuelvo para anunciar un nuevo proyecto que acabo de hacer entrar en fase alpha a la espera de que los usuarios me den algo de feedback.

Su nombre es ask.js y se trata de un módulo JavaScript que permite hacer búsquedas en un array de objetos utilizando la sintaxis de consultas de MongoDB.

No sé si conoceis un poco MongoDB pero se trata de una base de datos NoSQL orientada a documentos, documentos BSON, de hecho. BSON es una implementación binaria de JSON. Realizar búsquedas en Mongo se hace mediante una suerte de “objetos parciales” del tipo { name: 'Anne', 'address.city': 'Madrid', ...} aunque también admite restricciones complejas por campo como en { manufacturer: { $in: ['Ford', 'Munstang', 'Land Rover'] }, year: { $gte: 1990, $lt: 2000} }.

Una vez añadidos ask.js, puedes hacer ask.mongify() sobre un array para extender el mismo con un nuevo método find() que acepta, hasta el momento, las siguientes características de las búsquedas de MongoDB:

  • Restricciones por valor: { field: value }
  • Expresiones JS en cláusulas $where
  • Subobjetos, elementos parciales: { 'field.subfield': value } y $elemMatch
  • Comprobación de existencia $exists
  • Restricciones por expresión regular: { field: /value/i } y $regex
  • Operadores de comparación <, <=, >= y >
  • Operadores lógicos $or, $and y $nor
  • Módulo $mod
  • Comprobación de tipo $type
  • Operadores de inclusión $in, $nin y $all
  • Metaoperador $not
  • Comprobación de tamaño $size
  • Comprobación de desigualdad $ne

Además, es mi primer proyecto siguiendo TDD utilizando Jasmine como framework de testing. Algún día os hablaré de Jasmine y de cuánto me gusta su API.

La idea se me ocurrió trabajando en el proyecto UDo, para Telefónica I+D (es un proyecto interno, no lo vais a encontrar). En él teníamos que indicar que ciertos objetos afectaban a otros de forma intensional, esto es, sin citar explícitamente cada uno de los objetos afectados sino dando una definición basada en sus propiedades.

Visualmente, en vez de decir que el objeto O afecta a los objetos cuya propiedad type es target (pongamos que son los objetos A, B y C)…

{_id:'O', affects: ['A', 'B', 'C']}

…lo indicamos refiriéndonos precisamente a su propiedad type:

{_id:'O', affects: {type:'target'}}

Así podemos obtener la lista de los objetos afectados lanzando la query almacenada en el campo affects del objeto afectante.

El caso es que a veces necesitábamos comprobar si un nuevo objeto, creado en el cliente, era de un determinado tipo. Esto hubiera supuesto mandar una copia del recién creado al servidor, creando una tabla auxiliar exclusiva para él, luego lanzar cada objeto en el campo affect de cada afectante y comprobar si, para cada uno, la query indica que el nuevo objeto está afectado (la query devuelve resultados) o no está afectado (no devuelve resultados).

Para liberar al servidor de esta tarea, hubiera estado muy bien disponer de la misma API de búsqueda en el cliente… y así surgió la idea de hacer ask.js

Cambié de proyecto mientras estábamos discutiendo alternativas que no sobrecargaran al servidor. Por lo que sé, al final se implementó un conjunto muy reducido de la API de Mongo.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s