sql >> Databasteknik >  >> NoSQL >> MongoDB

Hämta index för ett objekt inom mongodb-frågan

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 en finalize() 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.




  1. Hur man subtraherar två datum och tid i mongodb

  2. Hur installerar man MongoDB på Windows-system?

  3. Hitta dokument efter array av DBRefs

  4. TypeError vid /accounts/login/ id måste vara en instans av (str, unicode, ObjectId), inte <typ 'int'>