2016-07-05 10 views
1

Mit sequelize auf meiner nodejs Web-App möchte ich Beiträge mit Paginierung (nach Datum) abfragen. Lesen sequelize docs, bieten sie offset und limit zu verwenden.Sequelize Paginierung

Da ich die Beiträge von neu bis alt anzeigen möchte, muss ich das Datum betrachten, an dem sie erstellt wurden. Wenn ich z. B. die erste Abfrage auf 10 Seiten beschränke und vor Ausführung der zweiten Abfrage einen neuen Beitrag erstellt habe, ergibt die nächste Abfrage mit dem Offset 10 einen doppelten Beitrag aus der letzten Abfrage.

Wie soll ich die Seitennummerierung implementieren, damit neue Einträge unterstützt werden?

Antwort

6

Wenn Sie eine stabile Seitennummerierung wünschen, paginieren Sie nicht auf Zeilenoffset, da es flüchtig ist, aus dem Grund, den Sie erwähnen.

Sie sollten auf einen Wert paginieren, der im Zeitverlauf stabil ist, und eine where-Klausel zum Filtern der Ergebnisse verwenden. Der beste Fall wäre, wenn Sie eine automatisch inkrementierende ID haben, aber das Post-Datum könnte auch vernünftig sein.

Etwas wie:

Post.findAll({ 
where: { createdDate: { $lt: previousDate }, 
limit: 10 
}) 

Sie müssen für diese OFC Spur von previousDate zu halten. Dieser Ansatz hat auch einige Einschränkungen, und Sie müssen es möglicherweise mit clientseitiger Deduplizierung kombinieren.

Hier ist ein Blog-Post, die wahrscheinlich die Antworten alle notwendigen hat: Pagination: You're (Probably) Doing It Wrong

3

Der einfachste Weg, dies zu tun ist Sequelize der findAndCountAll

Post.findAndCountAll({ 
    where: {...}, 
    order: [...], 
    limit: 5, 
    offset: 0, 
}).then(function (result) { 
    res.render(...); 
}); 

Hier zu verwenden, Ergebnis hat sowohl das Ergebnis der Ihre Abfrage und zählen als result.row und result.count. Sie können dann den Offset erhöhen und diesen für die Paginierung verwenden.

Sequelize documentation for findAndCountAll