Digamos que tengo esta matriz de datos:
const ids = [ '7d8206d2-74bc-4b90-a237-37f92486cde4', 'e594fe7f-d529-4a2f-ab24-ffc4e102268c', '7d8206d2-74bc-4b90-a237-37f92486cde4' ]Como puede ver, hay ID duplicados y cuando quiero actualizarlo así:
await knex("products") .increment("purchasesCount") .whereIn("id", ids) En mi columna de purchasesCount , puedo ver los valores (1, 1) , pero debería ser (2, 1) debido a las identificaciones duplicadas. ¿Hay alguna forma de arreglarlo?
La solución más sencilla es emitir una consulta por cada compra, de la siguiente manera:
for (const id of ids) { await knex("products").increment("purchasesCount").where({ id: id }); }Si esto es imposible por alguna razón (por ejemplo, el rendimiento), entonces tiene 2 opciones:
.whereIn("id", idsWithThisCountOnly) . Entonces, en el ejemplo anterior, haría 2 actualizaciones, una para todas las identificaciones que se encontraron solo una vez en la matriz y otra para todas las identificaciones que se duplicaron. Probablemente necesitará un Map of id => count para contar duplicados, y deberá invertirlo más tarde en la forma de count => idsWithThisCountOnly[] .GROUP BY con COUNT cuando recupere los datos. Esto debería ofrecer un mejor rendimiento de escritura (las INSERCIONES suelen ser más rápidas que las ACTUALIZACIONES), pero con un mayor tamaño de almacenamiento y lecturas más lentas.La opción 2 puede ser preferible si ya tiene una tabla de "transacciones" o "ventas" con elementos de línea y accede a los datos de resumen con poca frecuencia.