2015-06-06 22 views
6

Chciałbym utworzyć kwerendę, która jest w stanie policzyć liczbę rekordów dla każdego dnia w miesiącu naraz w sequelize.js Nie lubię:Multiple query count w 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"); 
}); 

.... 
.... 

chcę zrobić kwerendę która zwróci liczbę wierszy na raz, a nie jak bazę danych zapytań dla tych danych w 30 zapytaniach. Można to zrobić z transakcjami?

będę używać go do celów wykresu, więc najlepiej jest wyjście z tego jak:

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

Dzięki za wszelką pomoc!

Odpowiedz

5

Dla tego typu kwerendy, można użyć funkcji date_trunc postgresql z grupy:

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

Wielkie dzięki, już stworzyłem to z surowym zapytaniem. Zasadniczo twoje rozwiązanie jest takie samo. – Makromat

+0

Czy naprawdę jesteś Dj? Mam kolumny cenowe w tych wierszach. Czy wiesz, w jaki sposób mogę zsumować wszystkie ceny w tym przypadku dla wszystkich rekordów w danym dniu? – Makromat

+1

Użyj funkcji 'sum' zamiast' count'. Zobacz tę definicję atrybutu: "[ db.sequelize.fn (" suma ", db.sequelize.col (" cena ") ), " priceSum " ]' –

2

Moje rozwiązanie z zapytaniem surowca dla 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]); 
}); 

Mam nadzieję, że ktoś pomaga.