Bestilling efter subjectID
Hvis dit subjectID
er (eller kan ændres til) en monotont stigende værdi (for eksempel et MongoDB standard ObjectID), har du en ligetil mulighed ved at bruge en normal find()
med passende sortering, spring over og begrænsning. I dette tilfælde kan du søge efter dokumenter med emne-ID'er $gte
(større end eller lig med)
dit subjectID
:
var page = 1;
var subjectID = ObjectId("515535a0760fe8735f5f6897");
db.users.find(
{ _id: { $gte : subjectID } }
).sort({'_id':1}).skip(page*20).limit(20)
Aggregation Framework
Som ved MongoDb 2.4 er der ikke en sådan funktion i Aggregation Framework, der matcher baseret på dokumentets position i resultatpipelinen. Du kan indsende et nyt funktionsforslag MongoDB Jira-projektets SERVER kø.
Det lyder som om du gerne vil have en ny pipeline-operatør, såsom en $matchfrom
hvilket ville ignorere alle dokumenter indtil den første forekomst af $matchfrom
kriterier. Du kan derefter tilføje en $limit
at tage de næste n elementer. Du vil også gerne have sorteret output før $matchfrom
så der er et forudsigeligt resultat.
Dette virker overkompliceret sammenlignet med at have et stigende emne-ID, men der kan være en brugssag til at foretage personsøgning baseret på mere avancerede søgekriterier eller resultater beregnet i aggregeringspipelinen.
Alternative tilgange
Bortset fra fremtidig understøttelse af en sådan funktion i Aggregation Framework, har du et par muligheder for at implementere den samme matchende tilgang i kode:
-
brug den ældre
group()
aggregeringskommando med enfinalize()
fungere. BEMÆRK:group()
gør ikke arbejde med splittede klynger. -
brug MapReduce og en
finalize()
funktion -
hent hele resultatsættet fra Aggregation Framework, og implementer matchning/reduktion af resultater i din applikationskode (selvom dette noget besejrer "paging"-begrebet, hvis du henter alle sider for hver anmodning).
Ydeevneovervejelser
Forespørgsler med skip
over stadig nødt til at læse de mellemliggende indeksposter igennem, så det vil ikke være særlig effektivt at springe et stort antal dokumenter over.
I stedet for at søge med en overspringsforskydning, kan du overveje at udføre successive sideforespørgsler ved at starte fra den sidste indgang på den forrige side (dvs. den første side ville være $gte
startemne-id'et og efterfølgende sider ville være $gt
det sidste emne-ID inkluderet på forrige side). Dette vil afhænge af, hvordan du præsenterer personsøgningen i din brugergrænseflade - det ville være nemmest at bruge denne tilgang, hvis din brugergrænseflade kun har mulighed for at vise "næste" side med beskeder i stedet for at hoppe til en bestemt side.