Beställer efter subjectID
Om ditt subjectID
är (eller kan ändras till) ett monotont ökande värde (till exempel ett MongoDB standardobjekt-ID), har du ett enkelt alternativ med en normal find()
med lämplig sortering, hoppa över och begränsa. I det här fallet kan du leta efter dokument med subjectIDs $gte
(större än eller lika med)
ditt subjectID
:
var page = 1;
var subjectID = ObjectId("515535a0760fe8735f5f6897");
db.users.find(
{ _id: { $gte : subjectID } }
).sort({'_id':1}).skip(page*20).limit(20)
Aggregationsram
Som i MongoDb 2.4 finns det ingen sådan funktion i aggregeringsramverket som matchar baserat på dokumentpositionen i resultatpipelinen. Du kan lämna in ett nytt funktionsförslag MongoDB Jira-projektets SERVER kö.
Det låter som att du skulle vilja ha en ny pipeline-operatör som en $matchfrom
vilket skulle ignorera alla dokument tills den första förekomsten av $matchfrom
kriterier. Du kan sedan lägga till en $limit
för att ta nästa n objekt. Du skulle också vilja ha sorterad utdata före $matchfrom
så det finns ett förutsägbart resultat.
Detta verkar överkomplicerat jämfört med att ha ett ökande subjectID, men det kan finnas ett användningsfall för att göra personsökning baserat på mer avancerade sökkriterier eller resultat beräknade i aggregeringspipelinen.
Alternativa tillvägagångssätt
Bortsett från framtida stöd för en sådan funktion i Aggregation Framework, har du några alternativ för att implementera samma matchningsmetod i kod:
-
använd den äldre
group()
aggregeringskommando med enfinalize()
fungera. OBS:group()
gör inte arbeta med fragmenterade kluster. -
använd MapReduce och en
finalize()
funktion -
hämta hela resultatuppsättningen från Aggregation Framework och implementera matchning/minskning av resultat i din applikationskod (även om detta något motverkar "personsökning"-begreppet om du hämtar alla sidor för varje begäran).
Prestandaöverväganden
Frågor med skip
måste fortfarande läsa igenom de mellanliggande indexposterna, så att hoppa över ett stort antal dokument kommer inte att vara särskilt effektivt.
Istället för att söka med en överhoppningsoffset kan du överväga att göra på varandra följande sidfrågor genom att börja från den sista posten på föregående sida (dvs. den första sidan skulle vara $gte
startämne-ID och efterföljande sidor skulle vara $gt
det sista ämnes-ID som finns på föregående sida). Detta beror på hur du presenterar personsökningen i ditt användargränssnitt - det skulle vara enklast att använda detta tillvägagångssätt om ditt användargränssnitt bara har möjlighet att visa "nästa" sida med meddelanden istället för att hoppa till en specifik sida.