Last chance! 50% off DataCamp Premium
Sale ends in
MongoDB is een populaire NoSQL-database die is ontworpen voor flexibiliteit en performance. In tegenstelling tot traditionele relationele databases die gestructureerde tabellen en SQL gebruiken, slaat MongoDB data op in flexibele, JSON-achtige documenten. Dat maakt het ideaal voor developers die werken met dynamische of semi-gestructureerde data.
Een van de belangrijkste operaties die je in MongoDB uitvoert, is het opvragen van data; de meestgebruikte methode hiervoor is find(). Of je nu net begint of je query-skills wilt aanscherpen, begrijpen hoe find() werkt is essentieel om je MongoDB-data effectief te doorzoeken en te manipuleren.
Stel, je verkent een filmdatabase. Je wilt alle sciencefictionfilms vinden die na 2000 zijn uitgebracht, of misschien alle gebruikersreacties in een bepaalde periode op een rij zetten. Dat is waar find() in uitblinkt.
In dit artikel leer je hoe je de find()-methode gebruikt om documenten uit een collectie op te halen, filters toe te passen, velden te projecteren, resultaten te sorteren en performance te optimaliseren—allemaal met het sample_mflix-datataset.
Wil je hands-on zien hoe je MongoDB inzet in data science-workflows? Bekijk de cursus Introduction to MongoDB in Python.
De find()-methode is MongoDB’s primaire manier om documenten uit een collectie op te halen. Het retourneert een cursor naar de documenten die aan de opgegeven query voldoen. Je kunt vervolgens over deze cursor itereren, of hem naar een array converteren, afhankelijk van de behoeften van je applicatie.
Hier is de volledige syntax:
db.collection.find(<query>, <projection>, <options>)
query (optioneel): Een document dat de criteria definieert voor het selecteren van documenten. Als je deze parameter weglaat of een leeg document ({}) doorgeeft, retourneert find() alle documenten in de collectie.projection (optioneel): Een document dat specificeert welke velden moeten worden geretourneerd. Je kunt velden opnemen (1) of uitsluiten (0). Standaard retourneert MongoDB alle velden, inclusief _id.options (optioneel): Een extra document om het querygedrag te configureren. Je kunt zaken instellen zoals sorteervolgorde, pagineringlimieten, time-outs en index-hints.Om de concepten zo duidelijk en toepasbaar mogelijk te maken, gebruiken we de MongoDB Atlas sample dataset—specifiek de sample_mflix-database. Deze dataset bevat collecties zoals movies, comments, users en theaters, waar we in dit artikel naar verwijzen om elk voorbeeld te demonstreren.
db.books.find(
{ year: { $gte: 2000 } }, // query: books published in or after 2000
{ title: 1, author: 1, _id: 0 }, // projection: include only title and author
{ sort: { title: 1 }, limit: 5 } // options: sort by title, return only 5 books
)
Deze query:
_id uit).
Figuur 1. Deze query vindt films die na 2000 zijn uitgebracht, gesorteerd op titel en beperkt tot vijf resultaten.
Het resultaat is een cursor, die overeenkomende documenten lui (lazy) laadt terwijl je erover iterereert. Je kunt .toArray() of .forEach() gebruiken om de resultaten te verwerken.
Als je verbonden bent via de MongoDB-shell (mongosh) en het resultaat niet aan een variabele toewijst, worden standaard alleen de eerste 20 documenten weergegeven. Typ vervolgens it en druk op Enter om extra documenten te bekijken. Dit proces blijft de volgende batch van de cursor ophalen.
> Opmerking: Het bovenstaande is shell-specifiek gedrag, geen beperking van MongoDB. In de meeste MongoDB-drivers (bijv. Node.js, Python, Java) haalt het aanroepen van .toArray() of itereren over de cursor automatisch alle overeenkomende resultaten op. Het gedrag van cursors kan variëren afhankelijk van de omgeving en taal die je gebruikt.

Figuur 2. Deze query haalt alle films op, retourneert alleen het veld _id en gebruikt de cursor om extra resultaten op te halen.
Als je nieuw bent met NoSQL-databases, biedt de cursus Introduction to NoSQL basisconcepten die deze tutorial aanvullen.
Gaande met het filmvoorbeeld: stel dat je alle films in het genre Sci-Fi wilt ophalen. Zo doe je dat:
db.movies.find({ genres: "Sci-Fi" })
Nu wil je alleen films die in of na het jaar 2000 zijn uitgebracht:
db.movies.find({ year: { $gte: 2000 } })
En als je beide wilt? Combineer voorwaarden:
db.movies.find({ genres: "Sci-Fi", year: { $gte: 2000 } })
Je kunt het ook expliciet schrijven met $and:
db.movies.find({ $and: [ { genres: "Sci-Fi" }, { year: { $gte: 2000 } } ] })
Beide queries geven hetzelfde resultaat—documenten met het genre Sci-Fi en het releasejaar 2000 of later. De eerste vorm is compacter en de voorkeur wanneer de velden verschillend zijn.

Figuur 3. Dit zijn verschillende manieren om de query te schrijven die hetzelfde resultaat opleveren.
Gebruik find() als een filtertrechter—elke voorwaarde vernauwt je resultaten.
Laten we nu bekijken hoe je vergelijkings- en logische operators inzet om je queries naar een hoger niveau te tillen.
$eq, $ne: gelijk, niet gelijk$gt, $gte, $lt, $lte: groter/kleiner dan (of gelijk aan)$in, $nin: in of niet in arrayStel dat je klantbestellingen bijhoudt en bestellingen tussen $100 en $500 wilt zien:
db.orders.find({ total: { $gte: 100, $lte: 500 } })
$and, $or, $nor, $notStel nu dat je producten wilt tonen in de categorie "Books" of met een prijs onder $20. Hier is een voorbeeldquery:
db.products.find({ $or: [ { category: "Books" }, { price: { $lt: 20 } } ] })
Je kunt geneste velden benaderen met dot-notatie:
db.customers.find({ "address.city": "Chicago" })
Projectie laat je alleen teruggeven wat je nodig hebt, wat performance en duidelijkheid aanzienlijk kan verbeteren.
db.movies.find({}, { directors: 1, languages: 1, _id: 0 })
Belangrijk: Bij het opgeven van een projectie moet je in MongoDB kiezen tussen twee modi: ofwel specifieke velden opnemen (1) ofwel specifieke velden uitsluiten (0). Je kunt beide stijlen niet in dezelfde projectie mixen, behalve voor het veld _id, dat je kunt uitsluiten zelfs wanneer je andere velden opneemt.
✅ Geldig (alleen inclusie):
db.movies.find({}, { directors: 1, languages: 1 })
✅ Geldig (alleen exclusie):
db.movies.find({}, { directors: 0, _id: 0 })
❌ Ongeldig (mix van inclusie en exclusie):
db.movies.find({}, { directors: 1, languages: 0 }) // Not allowed
De enige uitzondering is het _id-veld, dat je kunt uitsluiten zelfs wanneer je andere velden opneemt:
db.movies.find({}, { directors: 1, _id: 0 }) // Allowed

Figuur 4. Dit voorbeeld laat de fout zien die optreedt door velden op te nemen en uit te sluiten in één projectie, wat MongoDB niet toestaat, behalve voor `_id`.
Bij grote datasets is het gebruikelijk om gebruikers slechts een deel van de data tegelijk te tonen—een techniek die paginering heet. Een streamingapp toont bijvoorbeeld 10 films per pagina in plaats van er in één keer duizenden te laden. Dat verbetert niet alleen de performance, maar ook de gebruikerservaring.
In MongoDB bereik je paginering met een combinatie van sort(), limit() en skip().
Als je uit een SQL-achtergrond komt, zie je hier hoe veelvoorkomende pagineringsconcepten zich verhouden:
Basisquery in SQL:
SELECT * FROM movies WHERE year >= 2000
Hetzelfde kun je in MongoDB als volgt uitdrukken:
db.movies.find({ year: { $gte: 2000 } })
Veldselectie in SQL:
SELECT title, year FROM movies
Veldselectie in MongoDB:
db.movies.find({}, { title: 1, year: 1, _id: 0 })
Laten we nu nog enkele voorbeelden bekijken van veelvoorkomende queryoperaties:
Sorteren:
ORDER BY title ASC.sort({ title: 1 })Beperken:
LIMIT 10.limit(10)Overslaan:
OFFSET 10.skip(10)Deze parallellen begrijpen helpt SQL-gebruikers makkelijker over te stappen naar het documentgebaseerde querysysteem van MongoDB.
Sorteren helpt je resultaten te ordenen op basis van een specifiek veld—bijvoorbeeld om films alfabetisch op titel te sorteren:
db.movies.find().sort({ title: 1 }) // ascending (A–Z)
1 betekent oplopend (A–Z, 0–9)-1 betekent aflopend (Z–A, 9–0)Geef slechts een bepaald aantal resultaten terug—bijvoorbeeld de eerste 10:
db.movies.find().limit(10)
Dit is handig bij het maken van “Top 10”-lijsten of initiële weergaven.
Gebruik dit om documenten over te slaan. Het wordt vaak samen met limit() gebruikt voor paginering:
db.movies.find().skip(10).limit(10)
Dit slaat de eerste 10 documenten over en retourneert de volgende 10; effectief toon je Pagina 2 wanneer pageSize = 10.
Pagineringformule:
skip = (pageNumber - 1) * pageSize
> Opmerking: skip() gebruiken voor diepe paginering (bijv. skip(10000)) kan inefficiënt zijn, omdat MongoDB de overgeslagen documenten alsnog scant en weggooit. Voor betere performance bij grote datasets kun je range-gebaseerde paginering overwegen met geïndexeerde velden zoals _id.
db.movies.find()
.sort({ title: 1 })
.skip(20)
.limit(10)
Dit patroon is ook handig voor features als “meer laden” of infinite scroll.

Figuur 5. Deze query haalt de derde pagina met resultaten op (10 films per pagina), geordend op titel.
De find()-methode retourneert een cursor—een pointer naar de resultset. Je kunt erover itereren:
const cursor = db.movies.find({ type: "movie" });
cursor.forEach(doc => print(doc.name));
Of hem omzetten naar een array:
const results = db.collection.find().toArray();

Figuur 6. Na het aanroepen van `find()` ontvang je een cursor. Je kunt die gebruiken om over documenten te itereren of de volledige resultset naar een array te converteren.
> Opmerking: Het cursorobject is beschikbaar in mongosh of in code via drivers (bijv. Node.js, Python). GUI-tools zoals MongoDB Compass handelen cursors intern af. Je krijgt daar geen directe toegang toe en iterateert er niet handmatig over.
Om je queries fijn af te stemmen, kun je extra cursormethodes gebruiken:
db.users.find({ age: { $gte: 30 } })
.sort({ name: 1 })
.limit(10)
.skip(5)
.maxTimeMS(200)
.hint({ age: 1 })
maxTimeMS(ms): breekt de query af als die te lang duurthint(): dwingt MongoDB een specifieke index te gebruikenbatchSize(n): bepaalt het aantal docs per batchAan het voorbereiden op sollicitaties? Bekijk de Top 25 MongoDB Interview Questions and Answers om je begrip van kernconcepten zoals find() te testen.
Indexen zijn als spiekbriefjes—ze helpen MongoDB om documenten sneller op te halen.
db.movies.createIndex({ type: 1 })
db.users.find({ type: "movie" }).explain()
Dit laat zien of indexen worden gebruikt en hoe efficiënt je query is.
Zonder index: 
Figuur 7. Voer `explain()` uit op de query vóór het indexeren.
Een index maken:
![]()
Figuur 8. Maak een eenvoudige index op het veld type.
Met een index:

Figuur 9. Voer dezelfde query uit met `explain()`, nu met gebruik van een index.
Je ziet dat de fase die eerder CollScan was (de collectie scannen) is veranderd naar Fetch + IXSCAN, wat in feite de index gebruiken + andere data opzoeken betekent die geen deel uitmaakt van de index (omdat we alles retourneren).
Als je liever visuele tools gebruikt, is MongoDB Compass de officiële GUI-client. Hiermee kun je:
Je kunt zelfs schakelen naar de "JSON view" om queries te kopiëren/plakken in je code.
Als je MongoDB Atlas gebruikt, kun je Atlas Search benutten met de AI-aangedreven querybuilder.
Typ gewoon een prompt in natuurlijke taal zoals:
"Toon me alle klanten uit Brazilië die in de afgelopen maand bestellingen boven $100 hebben geplaatst."
Atlas stelt een bijpassende MongoDB-query voor met find() of $search. Het is een uitstekende productiviteitsbooster, vooral wanneer je niet zeker bent van de syntax.

Figuur 10. Gebruik Compass om een query te genereren vanuit natuurlijke taal.
limit + skip)_idAls je uit een SQL-achtergrond komt, kan het begrijpen hoe MongoDB’s find() zich verhoudt tot vertrouwde SQL-queries de overgang makkelijker maken. Hier is een algemene vergelijking van veelvoorkomende operaties:
|
Concept |
SQL-voorbeeld |
MongoDB-equivalent |
|
Basisquery |
|
|
|
Veldselectie |
|
|
|
Sorteren |
|
|
|
Beperken |
|
|
|
Overslaan |
|
|
Zoals je ziet is de syntax van MongoDB meer JavaScript-achtig en expressief in JSON-formaat, terwijl SQL declaratiever en gestructureerd is. Deze parallellen kennen helpt je sneller thuis te raken in MongoDB.
find() als je datafilter—combineer voorwaarden voor precieze resultaten.Of je nu een startupdashboard bouwt, een data-analysetool of een e-commerce-backend, het beheersen van find() maakt je MongoDB-ervaring soepeler, sneller en effectiever.
Blijf onze toekomstige artikelen volgen voor meer MongoDB-inzichten!
Wil je je MongoDB-skills valideren? Lees de Complete Guide to MongoDB Certification om je opties te verkennen.
MongoDB retourneert een cursor, die documenten in batches laadt (lazy loading). Dit is efficiënt voor grote collecties, maar kan beginners verwarren die een array verwachten.
Omdat de meeste developers ketenmethodes zoals .sort(), .limit() en .skip() gebruiken in plaats van ze in het options-object door te geven. Sommige features (bijv. hint, readConcern, collation) vereisen het gebruik van het options-document of aparte method calls.
Niet alle queries gebruiken automatisch indexen. Veldvolgorde, datatypen en collation-instellingen kunnen het indexgebruik beïnvloeden. Gebruik .explain("executionStats") om te controleren of MongoDB een index gebruikt (IXSCAN) of een volledige scan uitvoert (COLLSCAN).
Als de geprojecteerde velden niet in een index staan, moet MongoDB nog steeds het volledige document van disk ophalen. Gebruik covering indexes om de query volledig vanuit de index te bedienen en documentlookups te vermijden.
Nee. find() is bedoeld om documenten op te halen. Voor groeperen of samenvatten gebruik je het Aggregation Framework ($group, $count, enz.). Hoewel find() + .countDocuments() eenvoudige tellingen aankan, zouden echte analytische behoeften .aggregate() moeten gebruiken.
find() retourneert een cursor naar alle overeenkomende documenten, terwijl indOne() direct het eerste overeenkomende document retourneert. Gebruik findOne() wanneer je maar één resultaat nodig hebt.
Je kunt array-elementen direct matchen. Bijvoorbeeld, { tags: "tech" } komt overeen als "tech" in de tags-array staat. Gebruik $elemMatch voor complexere voorwaarden.
Ja, MongoDB ondersteunt regex-patronen met syntax zoals { title: /sci-fi/i } om case-insensitive patroonmatching op strings uit te voeren.
Gebruik ISODate-objecten in de query. Bijvoorbeeld: { createdAt: { $gte: ISODate("2024-01-01"), $lte: ISODate("2024-12-31") } }.
Queries op niet-geïndexeerde velden veroorzaken volledige collectie-scans, die traag zijn voor grote datasets. Indexeer altijd velden waar vaak op wordt gequeryd.
Samuel Molling is een Database Reliability Engineer met een passie voor het automatiseren en opschalen van veilige datainfrastructuur in de cloud.
Leer meer over MongoDB en databases met deze cursussen!
Cursus
Cursus
Cursus

blog
Adel Nehme
15 min