desventajas - mongodb vs sql server
¿Cómo traducir de SQL a NoSQL/MapReduce? (1)
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 clase en CouchDB.
Le agradecería que se tomara un momento para mapear cada declaración 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 comandos 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 documentación relacionada con las vistas para obtener detalles sobre cómo realizar consultas. Esto incluye ordenar, 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 conjunto de resultados.
SELECT category, SUM(price) FROM products GROUP BY category;
Mapa
function (doc) {
emit(doc.category, doc.price);
}
Reducir
_sum
Esta función de mapa utiliza esencialmente la categoría como la clave, con el precio como el valor en su par clave / valor. La función de reducción sumará los precios de cada clave 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 base de datos 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 fecha y hora, es posible que necesite ajustar la función de mapa así como su consulta a la vista. Usar una marca de tiempo (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 lista nuevamente a la base de datos (nuevamente con _bulk_docs
) se _bulk_docs
todos los documentos especificados.