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.
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
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? –