Bestellen op subjectID
Als uw subjectID
is (of kan worden gewijzigd in) een monotoon toenemende waarde (bijvoorbeeld een MongoDB standaard ObjectID), hebt u een eenvoudige optie met een normale find()
met de juiste sortering, overslaan en beperken. In dit geval kunt u zoeken naar documenten met subjectID's $gte
(groter dan of gelijk aan)
uw subjectID
:
var page = 1;
var subjectID = ObjectId("515535a0760fe8735f5f6897");
db.users.find(
{ _id: { $gte : subjectID } }
).sort({'_id':1}).skip(page*20).limit(20)
Aggregatieraamwerk
Net als bij MongoDb 2.4 is er geen dergelijke functie in het aggregatieraamwerk die overeenkomt op basis van de documentpositie in de resultatenpijplijn. U kunt een suggestie voor een nieuwe functie indienen bij de SERVER van het MongoDB Jira-project wachtrij.
Het klinkt alsof je een nieuwe pijplijnoperator wilt, zoals een $matchfrom
die alle documenten zou negeren tot het eerste optreden van de $matchfrom
criteria. Je zou dan een $limit
. kunnen toevoegen om de volgende n items te nemen. U wilt ook de uitvoer gesorteerd hebben vóór de $matchfrom
dus er is een voorspelbaar resultaat.
Dit lijkt te ingewikkeld in vergelijking met het hebben van een toenemende subject-ID, maar er kan een gebruiksvoorbeeld zijn voor paginering op basis van geavanceerdere zoekcriteria of resultaten die zijn berekend in de aggregatiepijplijn.
Alternatieve benaderingen
Afgezien van toekomstige ondersteuning voor een dergelijke functie in het Aggregation Framework, heeft u een paar opties om dezelfde matching-aanpak in code te implementeren:
-
gebruik de oudere
group()
aggregatieopdracht met eenfinalize()
functie. OPMERKING:group()
doet niet werk met shard-clusters. -
gebruik MapReduce en een
finalize()
functie -
haal de hele resultatenset op uit het Aggregation Framework en implementeer het matchen/verkleinen van resultaten in uw toepassingscode (hoewel dit enigszins de 'paging'-gedachte verslaat als u alle pagina's voor elk verzoek ophaalt).
Prestatieoverwegingen
Zoekopdrachten met skip
moet nog steeds de tussenliggende indexitems lezen, dus het overslaan van een groot aantal documenten zal niet erg efficiënt zijn.
In plaats van te bladeren met een offset voor overslaan, kunt u overwegen om opeenvolgende paginaquery's uit te voeren door te beginnen met het laatste item van de vorige pagina (d.w.z. de eerste pagina zou $gte
zijn de beginsubjectID en de volgende pagina's zijn $gt
de laatste subjectID die op de vorige pagina is opgenomen). Dit hangt af van hoe u de paging in uw gebruikersinterface presenteert - het zou het gemakkelijkst zijn om deze benadering te gebruiken als uw gebruikersinterface alleen de optie heeft om de "volgende" pagina met berichten weer te geven in plaats van naar een specifieke pagina te springen.