2017-09-06 1 views
0

Szenario:MongoDB/Segel finden(): verschiedene Datensätze mit Paginierung

Dokumente müssen von einer Seite Grenze von 20 geholt werden, in absteigender Reihenfolge sortiert. Die zurückgegebenen Ergebnisse müssen eindeutig sein (ID, Titel usw. basierend auf einer Eigenschaft)

prüfen Sie die Möglichkeit, dass Element A auf Seite 1 ein Duplikat auf Seite 2 haben kann.

Gibt es eine Abfrage, die mit dieser Art von Situation umgehen kann?

Es scheint nicht möglich in Sails Wasserlinie, aber ich frage mich, ob ein einheimischer Anruf zu Mongo das lösen kann.

+0

Was meinst du mit einzigartig in mongo? Wenn du zum Beispiel nach einzigartigen Titeln suchst und es 5 Einträge mit der gleichen Titeleigenschaft gibt, nimmst du die erste? Irgendeine Art von Summierung einer anderen Eigenschaft? Auch nicht sicher, was du mit duplizieren auf Seite 2 meinst - wie funktioniert das mit Einzigartigkeit? – arbuthnott

+0

Nehmen wir an, dass es zwei Dokumente gibt, die den gleichen Titel haben. Mit Seiten meinte ich, die Ergebnisse zu begrenzen, sagen wir 20. Das Problem ist also, dass wir in der ersten Reihe von Ergebnissen ein Dokument bekommen haben, von dem ich weiß, dass es in den nächsten 20 Ergebnissen ein anderes Dokument mit demselben Titel gibt. Wie stelle ich sicher, dass das zweite Dokument übersprungen wird, und stelle sicher, dass ich nach dem Ausschließen dieses Dokuments immer noch 20 Dokumente abrufen und senden kann? –

Antwort

0

Ich glaube nicht, dass Mongo tun kann, was Sie hier wollen. Es sieht so aus, als ob Sie den Befehl distinct von mongo verwenden können, um unterschiedliche Werte einer bestimmten Eigenschaft in einer Sammlung oder über das Ergebnis einer Abfrage hinweg zu erhalten (und Segel macht rohe Mongo-Abfragen über .native verfügbar).

Dies ist jedoch möglicherweise nicht nützlich, wenn Sie das gesamte repräsentative Objekt, nicht nur die einzelne Eigenschaft mit Unterscheidbarkeit, wünschen. Sie können auch nicht so abfragen, dass Ihnen eine bestimmte Anzahl eindeutiger Werte garantiert wird.

Ich denke, Sie werden gezwungen, dies in Code arbeiten, wenn es funktionieren muss. Ein hässlicher Weg ist es, "mehr als genug" Datensätze (30? 100?) Zu holen, um 20 eindeutige Werte sicher zu haben, und dann in einer Schleife durchzugehen, bis Sie 20 erhalten. Um die Paginierung zu implementieren, könnten Sie das Feld verwenden Sortierung auf (dies funktionieren würde, wenn dieses Feld auch das eindeutige Feld ist, oder nicht.

ein aPI-Aufruf Beispiel für eine Sammlung mit Feldern title und popularity (zum Beispiel), wo wir verschiedene Titel wollen und wird das Sortieren von popularity DESC :

getMoreRecords: function(req, res) { 
    var foundTitles = req.param('foundTitles'); // an array of titles we already have 
    var lowestPop = req.param('lowestPop'); // the lowest popularity already retrieved 
    Record.find({ 
     title: {'!': foundTitles}, 
     popularity: {'<': lowestPop} 
    }).limit(100).sort('popularity DESC').exec(function(err, records) { 
     // do the error handling... 
     var filteredRecords = records.filter(function(rec, idx, arr) { 
      return arr.indexOf(rec) === idx; 
     }); 
     // filteredRecords is guaranteed to contain records with unique, unseen titles in popularity desc order 
     // it could contain any number however 
     return res.json(filteredRecords.slice(0,20)); 
    }); 
} 

Dies erfordert eine Rücksendung alle Titel für jede neue Seite (dieser Code würde in module.exports einiger Controller sein) bereits auf dem Server festgestellt, dass zu vermeiden, könnten Sie. Tun Sie etwas von dieser Client-Seite, aber es wird immer komplizierter.

Im Allgemeinen würde ich empfehlen, "mehr als genug" Aufzeichnungen Client-Seite (wie, mehrere Seiten wert) und Abfragen, wenn Sie mehr brauchen, vielleicht nach ein paar Seiten. Und ich würde jedes Filtern von bereits gesehenen Titeln Client-Seite tun, anstatt auf dem Server, wie ich hier gezeigt habe.

+0

yeah, ich dachte gerade über die gleiche Sache .. holen mehr Aufzeichnungen als benötigt und das Herausfiltern. funktioniert bei mir ! Vielen Dank ! –

+0

Ich mache gerade eine Forschungsarbeit mit Mongo, und vielleicht habe ich in meiner Antwort hastig gesprochen. Es sieht so aus, als ob rohe Mongo-Queries die Gruppierung unterstützen (https://docs.mongodb.com/manual/reference/operator/aggregation/group/) und Operatoren, mit denen Sie den ersten Vertreter (https://docs.mongodb.com) aufnehmen können/Handbuch/Referenz/Operator/Aggregation/zuerst /). Du kannst es immer noch nicht über die Wasserlinie benutzen, aber du könntest dich zu den rohen Mongo-Anfragen durcharbeiten. – arbuthnott

Verwandte Themen