sql >> Database >  >> NoSQL >> MongoDB

Index van een item binnen mongodb-query ophalen

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




  1. MongoDB:een gemiddelde bijwerken in een document met 2 geneste arrays

  2. Resultaten herhalen met een externe API-aanroep en findOneAndUpdate

  3. Een bestand opslaan in MongoDB met behulp van Multer in Mongoose

  4. Hoe doe je SQL Like-operator in mongoDB met behulp van de officiële C#-driver?