2016-07-09 15 views
-1

I bin mit und $ limit für AJAX Paginierung in meiner Django app in meiner Aggregationsanfragen $ überspringen. Hier ist ein Beispiel von meinem Code:

art_cursor = Articles.objects.aggregate({'match': {'ntype': {'$in': [1,6]}}}, 
    {'$group': {'_id': {'title': '$title'}}}, 
    {'$sort': {'_id.title': -1}}, 
    {'$limit': 51 * page}, {'$skip': 51 * (page-1)}, 
    allowDiskUse=True) 

So habe ich einige sortierte Artikel bündeln und wollen einen einzigartigen Teil von ihnen für jede Seite zu bekommen, wenn der Benutzer nach unten scrollt.

Aber einige der Artikel werden auf verschiedenen Seiten wiederholt, das heißt, wenn ich obigen Code in Bereich (1,6) Schleife (für alle Artikel von 1 bis 5 Seiten), dann einige Artikel in Ergebnis-Array wird wiederholt.

Welche Workaround könnte dafür getan werden, oder vielleicht eine andere Möglichkeit, ich kann so etwas tun?

UPD1 btw, wenn ich $ sort Betrieb entfernen - es gibt keine Duplikate in Folge Array. Ich habe keine Ahnung, warum

+0

Können Sie einige Daten und die Ergebnisse zeigen, die dupliziert werden? $ in: [1,6] gibt Werte von 1 oder 6 und nicht von 1 bis 6 zurück. Es scheint mir, dass Sie doppelte Daten in Ihren Daten haben, aber mit etwas anderen Titeln. – Tiramisu

+0

@Tiramisu dies [1,6] bedeutet nichts über dieses Problem - ich finde nur Artikel, die 1 oder 6 Typ entspricht. Die Duplikate betreffen Objekte in meinem Fall. – vadimb

+0

Auch auf DBA veröffentlicht: http://dba.stackexchange.com/questions/143399/mongodb-avoid-sort-limit-optimization. Wie bereits erwähnt, bestimmt die '$ group'-Stufe die Eindeutigkeit .. und es sieht so aus, als wären die Stufen '$ limit' und '$ skip' umgekehrt. Einige Beispieldaten zur Veranschaulichung des Problems wären hilfreich. – Stennie

Antwort

0

Ok, das Problem über Art $ ist + $ limit MongoDB-Optimierung. Als wir nach $ sort $ limit bekommen haben, hat MongoDB optimizer nur Objekte sortiert, die wir in $ limit erhalten haben.

Quelle (MongoDB docs): https://docs.mongodb.com/manual/core/aggregation-pipeline-optimization/#agg-sort-limit-coalescence

+0

Das ist eine falsche Interpretation der Optimierung "$ sort + $ limit" in Aggregation. Diese Optimierung ermöglicht der Aggregation '$ sort'-Stufe, nur die maximale Anzahl von Ergebnissen zu verfolgen, die von der folgenden '$ limit'-Stufe verwendet werden können (dh um effizient Speicher für die Top-n-Ergebnisse zuzuweisen, die zurückgegeben werden anstatt Sortieren des gesamten Ergebnissatzes im Speicher). – Stennie