¿Cómo traducir de SQL a NoSQL / MapReduce?

Tengo experiencia trabajando con bases de datos relacionales, pero recientemente comencé a incursionar en CouchDB y me sorprendió cómo algunas operaciones no relacionales, que serían simples en SQL, no eran funciones de primera class en CouchDB.

Le agradecería que se tomara un momento para mapear cada statement SQL a continuación en su equivalente de MapReduce.

SELECT COUNT(*) FROM products WHERE price < 20.00; SELECT category, SUM(price) FROM products GROUP BY category; UPDATE products SET price = 19.99 WHERE price = 20.00; DELETE FROM products WHERE expires_at <= NOW(); 

Los commands SELECT son bastante fáciles. Las grabaciones masivas son un poco más complicadas. En general, usará alguna vista para recuperar los documentos que deben modificarse, luego usará la API _bulk_docs para enviar todos los cambios a la vez.

Además, consulte la documentation relacionada con las vistas para get detalles sobre cómo realizar consultas. Esto incluye orderar, agrupar, etc.


SELECT COUNT(*) FROM products WHERE price < 20.00;

Mapa

 function (doc) { if (doc.price < 20) { emit(doc.price); } } 

Reducir

 _count 

Si necesita que esto funcione con una cantidad arbitraria, no solo 20, deberá emitir el precio en todos los casos, y usar la startkey y la endkey de endkey para restringir su set de resultados.


SELECT category, SUM(price) FROM products GROUP BY category;

Mapa

 function (doc) { emit(doc.category, doc.price); } 

Reducir

 _sum 

Esta function de map utiliza esencialmente la categoría como la key, con el precio como el valor en su par key / valor. La function de networkingucción sumrá los precios de cada key diferente.


UPDATE products SET price = 19.99 WHERE price = 20.00;

Mapa

 function (doc) { if (doc.price == 20) { emit(doc.price); } } 

Una vez que su aplicación extrae el contenido de esta vista, realizará todas las manipulaciones en el código de su aplicación y luego enviará los resultados a la database a través de la API _bulk_docs .


DELETE FROM products WHERE expires_at <= NOW();

Mapa

 function (doc) { emit(doc.expires_at); } 

Dependiendo de cómo almacene sus valores de date y hora, es posible que necesite ajustar la function de map así como su consulta a la vista. Usar una timestamp (JS usa milisegundos en lugar de segundos) es probablemente la forma más rápida de lograr esto. Una vez que haya configurado su consulta, agregará un nuevo campo a cada uno de estos documentos. _deleted: true . Una vez que envíe esta list nuevamente a la database (nuevamente con _bulk_docs ) se _bulk_docs todos los documentos especificados.