Ga naar hoofdinhoud

MongoDB find(): Een complete beginnersgids voor het opvragen van data

Deze gids legt uit hoe je de MongoDB-methode find() gebruikt om data te queryen, filteren, sorteren en pagineren met voorbeelden uit de praktijk. Perfect voor beginners en overstappers van SQL.
Bijgewerkt 2 okt 2026  · 9 min lezen

Verken met AI

ChatGPTClaudePerplexity

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.

Introductie tot find() in MongoDB

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>)

Parameters

  • 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.

Voorbeeld

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:

  • Filtert boeken die in 2000 of later zijn gepubliceerd.
  • Retourneert alleen de velden title en author (sluit _id uit).
  • Sorteert de resultaten alfabetisch op titel (A–Z).
  • Beperkt de output tot de eerste vijf overeenkomende boeken.

Deze query vindt films die na 2000 zijn uitgebracht, gesorteerd op titel en beperkt tot vijf resultaten.

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.

Deze query haalt alle films op, retourneert alleen het veld _id en gebruikt de cursor om extra resultaten op te halen.

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.

Je eerste queries schrijven

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.

Dit zijn verschillende manieren om de query te schrijven die hetzelfde resultaat opleveren.

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.

Vergelijkings- en logische operators gebruiken

Laten we nu bekijken hoe je vergelijkings- en logische operators inzet om je queries naar een hoger niveau te tillen.

Vergelijkingsoperators

  • $eq, $ne: gelijk, niet gelijk
  • $gt, $gte, $lt, $lte: groter/kleiner dan (of gelijk aan)
  • $in, $nin: in of niet in array

Stel dat je klantbestellingen bijhoudt en bestellingen tussen $100 en $500 wilt zien:

db.orders.find({ total: { $gte: 100, $lte: 500 } })

Logische operators

  • $and, $or, $nor, $not

Stel 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 } } ] })

Geneste velden opvragen

Je kunt geneste velden benaderen met dot-notatie:

db.customers.find({ "address.city": "Chicago" })

Velden projecteren

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

Dit voorbeeld laat de fout zien die optreedt wanneer je velden opneemt en uitsluit in één projectie, wat MongoDB niet toestaat, behalve voor _id.

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`.

Resultaten sorteren, beperken en overslaan

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

SQL vs. MongoDB: Basisvergelijking

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:

  • SQL: ORDER BY title ASC
  • MongoDB: .sort({ title: 1 })

Beperken:

  • SQL: LIMIT 10
  • MongoDB: .limit(10)

Overslaan:

  • SQL: OFFSET 10
  • MongoDB: .skip(10)

Deze parallellen begrijpen helpt SQL-gebruikers makkelijker over te stappen naar het documentgebaseerde querysysteem van MongoDB.

Resultaten sorteren

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)

Resultaten beperken

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.

Resultaten overslaan

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.

Gecombineerd voorbeeld: Pagina 3, 10 films per pagina, gesorteerd op titel

db.movies.find()
  .sort({ title: 1 })
  .skip(20)
  .limit(10)

Dit patroon is ook handig voor features als “meer laden” of infinite scroll.

Deze query haalt de derde pagina met resultaten op (10 films per pagina), geordend op titel.

Figuur 5. Deze query haalt de derde pagina met resultaten op (10 films per pagina), geordend op titel.

Werken met cursors

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();

Na find() te hebben aangeroepen, ontvang je een cursor. Je kunt die gebruiken om over documenten te itereren of de volledige resultset naar een array te converteren.

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.

Geavanceerde cursoropties

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 duurt
  • hint(): dwingt MongoDB een specifieke index te gebruiken
  • batchSize(n): bepaalt het aantal docs per batch

Aan het voorbereiden op sollicitaties? Bekijk de Top 25 MongoDB Interview Questions and Answers om je begrip van kernconcepten zoals find() te testen.

Indexen en performance-optimalisatie

Indexen zijn als spiekbriefjes—ze helpen MongoDB om documenten sneller op te halen.

Een index maken

db.movies.createIndex({ type: 1 })

.explain() gebruiken

db.users.find({ type: "movie" }).explain()

Dit laat zien of indexen worden gebruikt en hoe efficiënt je query is.

Zonder index: Voer explain() uit op de query vóór het indexeren.

Figuur 7. Voer `explain()` uit op de query vóór het indexeren.

Een index maken: 

Maak een eenvoudige index op het veld type.

Figuur 8. Maak een eenvoudige index op het veld type.

Met een index: 

Voer dezelfde query uit met explain(), nu met gebruik van 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).

MongoDB Compass gebruiken om queries te visualiseren

Als je liever visuele tools gebruikt, is MongoDB Compass de officiële GUI-client. Hiermee kun je:

  • Visueel queries opbouwen met filters.
  • Documenten en indexen previewen.
  • Queryperformance optimaliseren en valideren.

Je kunt zelfs schakelen naar de "JSON view" om queries te kopiëren/plakken in je code.

Atlas + AI gebruiken om queries te genereren

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.

Gebruik Compass om een query te genereren vanuit natuurlijke taal.

Figuur 10. Gebruik Compass om een query te genereren vanuit natuurlijke taal.

Veelvoorkomende valkuilen en hoe ze te vermijden

  • Query’s op niet-geïndexeerde velden → Leidt tot trage performance
  • Grote resultsets → Gebruik paginering (limit + skip)
  • Inefficiënte projecties → Projecteer altijd alleen de benodigde velden
  • Typemismatches → Zorg dat veldtypen overeenkomen (bijv. nummer vs. string)
  • Inclusie en exclusie mixen in projecties → Niet toegestaan, behalve voor _id

MongoDB find() vergelijken met SQL

Als 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

SELECT * FROM users WHERE age >= 18

db.users.find({ age: { $gte: 18 } })

Veldselectie

SELECT name, email FROM users

db.users.find({}, { name: 1, email: 1, _id: 0 })

Sorteren

ORDER BY created_at DESC

.sort({ createdAt: -1 })

Beperken

LIMIT 10

.limit(10)

Overslaan

OFFSET 10

.skip(10)

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.

Samenvatting en best practices

  • Zie find() als je datafilter—combineer voorwaarden voor precieze resultaten.
  • Projecteer altijd alleen noodzakelijke velden voor duidelijkheid en performance.
  • Gebruik indexen om trage scans te vermijden.
  • Gebruik Compass als je de voorkeur geeft aan visuele feedback en sneller itereren.
  • Maak gebruik van de AI-assistent van MongoDB Atlas om sneller queries te genereren.
  • Verken geavanceerde cursoropties voor fijnafstemming van je 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.

FAQs

Wat is een cursor in de praktijk? Waarom geeft find() me niet gewoon een array met resultaten?

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.

Waarom heeft find() drie parameters, maar zie ik meestal maar twee? Waarom wordt het derde argument (options) zelden in voorbeelden getoond?

Omdat de meeste developers ketenmethode​s 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.

Waarom gebruikt find() de index die ik heb gemaakt niet? Ik heb een index aangemaakt, maar mijn find()-query is nog steeds traag.

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).

Verbetert mijn projectie de performance echt? Ik projecteer maar twee velden, maar het lijkt niet sneller.

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.

Kan ik find() gebruiken om data te groeperen of samen te vatten? Kan ik tellen hoeveel films er per jaar zijn uitgebracht met find()?

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.

Wat is het verschil tussen find() en findOne() in MongoDB?

 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.

Hoe query ik een array-veld met find() in MongoDB?

Je kunt array-elementen direct matchen. Bijvoorbeeld, { tags: "tech" } komt overeen als "tech" in de tags-array staat. Gebruik $elemMatch voor complexere voorwaarden.

Kan ik reguliere expressies gebruiken in MongoDB find()-queries?

Ja, MongoDB ondersteunt regex-patronen met syntax zoals { title: /sci-fi/i } om case-insensitive patroonmatching op strings uit te voeren.

Hoe gebruik ik find() met een datumbereik in MongoDB?

Gebruik ISODate-objecten in de query. Bijvoorbeeld: { createdAt: { $gte: ISODate("2024-01-01"), $lte: ISODate("2024-12-31") } }.

Wat is de performance-impact van find() zonder index te gebruiken?

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's photo
Author
Samuel Molling
LinkedIn

Samuel Molling is een Database Reliability Engineer met een passie voor het automatiseren en opschalen van veilige datainfrastructuur in de cloud. 

Onderwerpen
MongoDB
Data-engineering

Leer meer over MongoDB en databases met deze cursussen!

Cursus

Introductie tot MongoDB in Python

3 uur
24.4K
Leer hoe je flexibel gestructureerde data kunt bewerken en analyseren met MongoDB.
Bekijk detailsRight Arrow
Start Cursus
Meer bekijkenRight Arrow
Gerelateerd

blog

AI vanaf nul leren in 2026: een complete gids van de experts

Ontdek alles wat je moet weten om in 2026 AI te leren, van tips om te beginnen tot handige resources en inzichten van industrie-experts.
Adel Nehme's photo

Adel Nehme

15 min

Meer BekijkenMeer Bekijken