sql >> Database teknologi >  >> NoSQL >> MongoDB

Få indeks over et element i mongodb-forespørgsel

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




  1. ugyldig bytesekvens i US-ASCII (Ruby 1.9 + rails 2.3.8 + mongodb + mongo_mapper)

  2. Sådan forhindrer du tilbagerulninger i MongoDB

  3. Tilføj valgfri forespørgselsparameter ved hjælp af spring data mongodb repository

  4. Mongodb C# masseopdatering/erstat på undersamling