2015-06-06 16 views
6

Mi piacerebbe creare domanda che è in grado di contare il numero di record per ogni giorno in mese a una volta nella sequelize.js Non come:interrogazione conteggio multiplo in sequelize ORM

Record.count({ where: { createdAt: { $like: '2015-04-14%' } } }).then(function(c) { 
    console.log("2015-04-14 have been created" + c + "records"); 
}); 

Record.count({ where: { createdAt: { $like: '2015-04-15%' } } }).then(function(c) { 
    console.log("2015-04-15 have been created" + c + "records"); 
}); 


Record.count({ where: { createdAt: { $like: '2015-04-16%' } } }).then(function(c) { 
    console.log("2015-04-16 have been created" + c + "records"); 
}); 

.... 
.... 

Voglio fare l'interrogazione che restituirà il numero di righe contemporaneamente, non come chiedere il database per questi dati in 30 query. È possibile farlo con le transazioni?

lo userò per scopi grafico, quindi è meglio output di questo è come:

[500, 300, 400, 550....] 

Grazie per qualsiasi aiuto!

risposta

5

Per questo tipo di query, è possibile utilizzare la funzione di date_trunc PostgreSQL con il raggruppamento:

db.record.findAll({ 
    attributes: [ 
    [ 
     db.sequelize.fn('date_trunc', 
     'day', 
     db.sequelize.col('createdAt') 
    ), 
     'dateTrunc' 
    ], 
    [ 
     db.sequelize.fn('count', 
     db.sequelize.col('id') 
    ), 
     'count' 
    ] 
    ], 
    group: '"dateTrunc"' 
}).then(function(rows) { 
    console.log(rows); 
}); 
+0

Grazie mille, l'ho già creato con query non elaborata. Fondamentalmente la tua soluzione è la stessa. – Makromat

+0

Sei davvero un DJ? Ho il prezzo columnt in queste righe .. Sai come posso sommare tutti questi prezzi in questo caso per tutti i record in particolare giorno? – Makromat

+1

Usa la funzione 'sum' invece di' count'. Vedere la definizione di questo attributo: '[ db.sequelize.fn ('sum', db.sequelize.col ('price') ), 'priceSum' ]' –

2

La mia soluzione con la domanda prima per PostgreSQL:

db.sequelize 
    .query("SELECT count(*), date_trunc('month', \"createdAt\") AS date FROM tables WHERE active = true AND \"createdAt\" BETWEEN '"+moment().startOf('year').format()+"' AND '"+moment().format()+"' GROUP BY date") 
    .then(function(results){ 
    res.json(results[0]); 
}); 

Spero che aiuta a qualcuno.