Nemyslím si, že jasná odpověď na vaši otázku je možná. Viz #1869 :
Pro zodpovězení titulkové otázky Sequelize automaticky vygeneruje dílčí dotaz (např. #1719 ), ale nemůžete provést vlastní poddotaz. Nemám směrodatnou referenci pro negativ.
Vypadá to, že váš stůl je něco takového:
EssayStats
EssayId
EssayDate
WordCount
Pak můžete udělat něco takového:
return EssayStat.findAll({
attributes: [
[sequelize.literal('((SELECT wordCount FROM "EssayStats" WHERE "EssayId" = "EssayStat"."EssayId" EssayStat BY "createdAt" DESC LIMIT 1) - (SELECT wordCount FROM "EssayStats" WHERE "EssayId" = "EssayStat"."EssayId" EssayStat BY "createdAt" ASC LIMIT 1))'), 'difference'],
'EssayId'
],
group: ['EssayId']
});
Vše, co dělá, je spuštění dvou dotazů SELECT, přičemž z těchto dotazů po objednání podle proměnné, která vás zajímá, vezme MAX a MIN a poté vezme váš rozdíl. To vám dá to, co vás zajímá:rozdíl v počtu slov mezi nejnovější verzí a první verzí.
Trik je v tom zapouzdřit příkaz SELECT do pole atributu.
Samozřejmě je to špinavé a pravděpodobně ne o tolik lepší než konzervovaný sequelize.query
. Ale odpovídá to na podstatu vaší otázky.
Lepším řešením by mohlo být denormalizovat svá data a uložit „wordCountDelta“ přímo do modelu Essay. Pak byste mohli mít afterCreate
háček
pro automatickou aktualizaci pole. To by s největší pravděpodobností bylo také nejrychlejší řešení.
Odpověděl jsem na něco podobného zde .