Met MongoDB-query’s kunt u uw database snel en effectief doorzoeken en analyseren. De structuur van de methode is logisch en u kunt er talrijke parameters mee gebruiken.

Hoe collecties effectief doorzoeken

Als documentgebaseerde NoSQL-oplossing biedt MongoDB gebruikers de mogelijkheid om grote en diverse hoeveelheden gegevens eenvoudig op te slaan en te beheren. Het databasebeheersysteem is zeer flexibel en kan eenvoudig horizontaal worden geschaald.

In tegenstelling tot relationele databases worden gegevens in Mongo DB opgeslagen in BSON-documenten (binaire JSON) en gebundeld in collecties. Om deze aanpak echt te laten werken, is het belangrijk omover krachtige zoekmechanismen te beschikken die de database kunnen doorzoeken en de informatie kunnen presenteren die gebruikers nodig hebben. Met MongoDB-zoekopdrachten kan de database zelfs complex gestructureerde collecties doorzoeken om de informatie te leveren die u zoekt.

Tip

Is het gebruik van de shell voor MongoDB te verwarrend? MongoDB Compass is een gratis grafische gebruikersinterface die het navigeren door MongoDB eenvoudig maakt.

Wat zijn MongoDB-query’s?

MongoDB-query’s zijn een gebruiksvriendelijke tool voor het doorzoeken van complexe datastructuren. Ze volgen logische regels en werken net als de filteropties die u op de meeste websites aantreft. Hierdoor kunt u uw zoekopdracht zo nauwkeurig mogelijk formuleren, zodat u de best mogelijke resultaten krijgt. Dit is vooral belangrijk omdat MongoDB veel verschillende soorten gegevens kan opslaan. Zonder de nodige filteropties zou het moeilijk zijn om de database te beheren. In de volgende paragrafen leggen we uit wat u nodig hebt om MongoDB-query’s te maken en hoe u deze kunt gebruiken.

Wat zijn de vereisten voor MongoDB-query’s?

Er zijn slechts enkele vereisten voor het gebruik van MongoDB-query’s.

  1. Je moet MongoDB op je computer hebben geïnstalleerd. De database werkt op veel besturingssystemen, dus de onderstaande instructies werken zowel op Linux, OS X als Windows. De stappen die na de installatie volgen, zijn op alle systemen hetzelfde en hebben alleen betrekking op de database zelf. In onze MongoDB-tutorial kun je lezen hoe de installatie werkt.
  2. U hebt beheerdersrechten nodig om de zoekfunctie te kunnen gebruiken.
  3. Het is het beste om een testomgeving te creëren, zodat u Mongo DB-query’s zonder risico kunt uitproberen.

Hoe een testcollectie structureren

Open eerst de shell en log in als beheerder. Maak vervolgens een nieuwe collectie aan die zal dienen als testomgeving voor uw eerste MongoDB-query’s. Naast het doorzoeken van eenvoudige documenten, kan de methode ook arrays, verschillende velden en ingebedde documenten doorzoeken. Daarom hebben we besloten om een iets complexere collectie aan te maken. Op deze manier krijgt u een beter beeld van de reikwijdte van MongoDB-query’s.

Ons voorbeeld bestaat uit een lijst met klanten. Het formaat van deze lijst is als volgt:

{
    "name" : "Schulz",
    "units" : 642,
    "location" : [ "Germany", "Austria" ],
    "transactions" : {
        "first" : {
            "year" : 2017,
        },
        "last" : {
            "year" : 2023,
        },
        "total" : 14
    }
}
shell

Dit document bevat de volgende informatie:

  • naam: De naam van het bedrijf dat de goederen heeft gekocht.
  • eenheden: Het totale aantal producten dat door het bedrijf is besteld.
  • locatie: De locatie van het bedrijf. Als er meerdere vestigingen zijn, kunnen deze worden opgeslagen in de vorm van een array.
  • transacties: Dit veld bevat een extra document. Dit soort documenten worden ‘ingesloten documenten’ of ‘geneste documenten’ genoemd. Elk transactiedocument bevat informatie over hoe lang het bedrijf al klant is (onder het item ‘eerste’), wanneer de laatste bestelling is geplaatst (onder het item ‘laatste’) en het totale aantal keren dat het bedrijf producten heeft besteld (onder het item ‘totaal’).

Voor dit voorbeeld hebben we extra documenten toegevoegd om het gemakkelijker te maken om op een later moment informatie toe te voegen. Dit helpt om een goed overzicht van de informatie in de database te behouden.

Een testverzameling maken voor MongoDB-query’s

Nu gaan we een collectie aanmaken met de naam ‘Klanten’. Om het overzichtelijk te houden, nemen we slechts vijf items op in de collectie. Als je MongoDB-query’s gebruikt voor je werk, kun je met de insertMany uitgebreidere collecties aanmaken.

Dit is hoe onze testcollectie eruitziet:

db.customers.insertMany ( [
{
    "name" : "Schulz",
    "location" : [ "Germany", "Austria" ],
    "transactions" : {
        "first" : {
            "year" : 2017,
        },
        "last" : {
            "year" : 2023,
        },
        "total" : 14
    }
},
{
    "name" : "ATS",
    "units" : 17,
    "location" : "France",
    "transactions" : {
        "first" : {
            "year" : 2021,
        },
        "last" : {
            "year" : 2022,
        },
        "total" : 2,
    }
},
{
    "name" : "Meyer",
    "units" : 814,
    "location" : [ "Austria", "Germany" ],
    "transactions" : {
        "first" : {
            "year" : 2016,
        },
        "last" : {
            "year" : 2023,
        },
        "total" : 22,
    }
},
{
    "name" : "Pawolski",
    "units" : 313,
    "location" : [ "Germany", "Poland" ],
    "transactions" : {
            "first" : {
            "year" : 2017,
            },
        "last" : {
            "year" : 2020,
        },
        "total" : 9,
    }
},
{
    "name" : "Jorgensen",
    "units" : 7,
    "location" : "Denmark",
    "transactions" : {
        "first" : {
            "year" : 2022,
        },
        "last" : {
            "year" : 2023,
        },
        "total" : 2,
    }
}
] )
shell

Wanneer u deze invoer uitvoert met de gegevens die wij hebben gebruikt (of met uw eigen gegevens), krijgt u een lijst met object-ID’s terug. Deze zijn uniek en zorgen ervoor dat elk document ook via een bijbehorende ID kan worden gevonden. Als u zeker wilt weten dat alle documenten in de collectie zijn opgenomen, kunt u MongoDB find zonder parameters gebruiken:

db.customers.find ( )
shell

De uitvoer is een lijst met alle object-ID’s met de volledige documenten. U kunt deze nu doorzoeken met behulp van MongoDB-query’s.

Hoe MongoDB-query’s met velden en arrays te gebruiken

U kunt MongoDB-query’s gebruiken om afzonderlijke velden, meerdere velden, arrays en ingesloten documenten te doorzoeken. In de onderstaande secties gaan we ze allemaal bekijken.

Afzonderlijke velden opvragen met MongoDB-query’s

De uitvoer van MongoDB find laat zien hoe nuttig MongoDB-query’s kunnen zijn. Onze kleine steekproef levert een uitvoer op met lange tekenreeksen, dus u kunt zich voorstellen hoe het is als u met een grotere steekproef werkt.

In het volgende voorbeeld gebruiken we ook find, maar deze keer stellen we een speciale eis waaraan een document moet voldoen om te worden uitgevoerd. We gaan namelijk zoeken naar alle documenten met de naam ‘ATS’.

db.customers.find (
    { "name" : "ATS" }
)
shell

Eenvoudige MongoDB-query’s zoals deze zoeken nu alle documenten in de collectie en matchen die documenten met de naamwaarde ‘ATS’. Dit geldt slechts voor één item in onze collectie, dus de uitvoer ziet er als volgt uit:

db.customers.find ( { "name" : "ATS" } )
{
    "_id" : ObjectID ( "673d14684o75iftbb0ct5003" ),
    "name" : "ATS",
    "units" : 17,
    "location" : "France",
    "transactions" : {
        "first" : {
            "year" : 2021,
        },
        "last" : {
            "year" : 2022,
        },
        "total" : 2
    }
shell

Het omgekeerde werkt ook. Als u alle resultaten wilt weergeven behalve het item voor ‘ATS’, voert u het volgende in:

db.customers.find (
    { "name" : { $ne : "ATS" } }
)
shell

Als u MongoDB-query’s met verschillende waarden wilt uitvoeren, kunt u dit doen met een array. We doen dit met behulp van de klanten ATS en Jorgensen.

db.customers.find (
    { "name" : [ $in : [ "ATS", "Jorgensen" ] } }
)
shell

Meerdere velden opvragen met MongoDB-query’s

Als u nauwkeurige resultaten wilt, is het belangrijk om uw zoekopdracht specifieker te maken. U kunt uw MongoDB-zoekopdrachten nauwkeuriger maken door aanvullende parameters te gebruiken. Hieronder gaan we naast de bedrijfsnaam ‘ATS’ ook een waarde uit het segment ‘units’ specificeren. Op deze manier zoekt onze zoekopdracht naar een document dat beide waarden bevat:

db.customers.find (
    { "name" : "ATS", "units" : 17 }
)
shell

We hebben een exacte overeenkomst. Als slechts één van de twee waarden overeenkomt, wordt er geen resultaat weergegeven. Hier is een voorbeeld van een zoekopdracht zonder resultaten:

db.customers.find (
    { "name" : "ATS", "units" : 25 }
)
shell

Als u bij het gebruik van MongoDB-query’s rekening wilt houden met verschillende waarden, maar wilt dat de query een resultaat oplevert, zelfs als slechts aan één van de vereisten is voldaan, voert u het volgende in:

db.customers.find (
    { $or : [ {"name" : "ATS"}, { "units" : 25 } ] }
)
shell

Waarden in arrays opvragen

Je kunt bij MongoDB-query’s ook rekening houden met waarden in arrays. In onze collectie zitten bedrijven die vestigingen hebben in verschillende landen. Als je alle bedrijven wilt weergeven die ten minste één vestiging in Duitsland hebben, kun je het volgende invoeren:

db.customers.find (
    { "location" : "Germany" }
)
shell

De uitvoer bevat nu alle drie klanten die ten minste één vestiging in Duitsland hebben. Als u uw invoer wilt uitbreiden en bedrijven wilt vinden die vestigingen in Duitsland en Oostenrijk hebben met dezelfde query, kunt u een array gebruiken:

db.customers.find (
    { "location" : [ "Germany", "Austria" ] }
)
shell

Je zult zien dat de invoer slechts één resultaat weergeeft, ook al voldoen twee bedrijven in theorie aan de zoekcriteria. De reden hiervoor is dat MongoDB-query’s zich strikt houden aan de invoer die ze krijgen, inclusief de volgorde van de elementen. Als je wilt dat de methode waarden in aanmerking neemt ongeacht de volgorde waarin ze voorkomen, schrijf je de query als volgt:

db.customers.find (
    { "location" : { $all : [ "Germany", "Austria" ] } }
)
shell

Waarden in ingesloten documenten opvragen

In onze collectie hebben we ook ingebedde documenten, die ook kunnen worden uitgevoerd met behulp van MongoDB-query’s. Om dit te doen, moet u een punt toevoegen om aan MongoDB aan te geven dat een veld in een genest document moet worden geanalyseerd. Als u bijvoorbeeld een lijst wilt van alle klanten die meer dan tien transacties hebben, voert u het volgende in:

db.customers.find (
    { "transactions.total" : { $gt : 10 } }
)
shell

MongoDB opent het document ‘transactions’ en zoekt vervolgens het totale aantal transacties onder ‘total’.

Hoe de uitvoer van MongoDB-query’s te beperken

De uitvoer van MongoDB-query’s kan behoorlijk uitgebreid zijn, daarom kan het zinvol zijn om de uitvoer te beperken tot slechts enkele velden. U kunt projecties gebruiken om het aantal velden dat in de uitvoer wordt weergegeven te beperken. Deze bevatten de waarde 1 (velden die in de uitvoer moeten worden opgenomen) en 0 (velden die niet in de uitvoer moeten worden opgenomen).

In het volgende voorbeeld voeren we een tweedelige query uit. Eerst starten we een zoekopdracht zonder parameters met behulp van de find. Op zichzelf zou dit alle gegevens in de collectie weergeven. We volgen dit echter onmiddellijk op met een projectie die alleen rekening houdt met het veld ‘naam’.

db.customers.find (
    { }
    { "name" : 1 }
)
shell

Alle klanten worden weergegeven, maar de uitvoer wordt beperkt tot de namen van de bedrijven.

Wat zijn cursors en hoe kan ik ze gebruiken in MongoDB-query’s?

Cursors bieden een manier om de weergave van Mongo DB-queryresultaten aan te passen, zonder de daadwerkelijke resultaten van de query te wijzigen. U kunt bijvoorbeeld het aantal weergegeven resultaten beperken of de volgorde ervan wijzigen. Als u slechts twee van de resultaten wilt weergeven, kunt u de limit-methode gebruiken. Dat doet u als volgt:

db.customers.find (
    { }
    { "name" : 1 }
).limit ( 2 )
shell

Om de uitvoer te sorteren, kunt u de volgende invoer gebruiken. Hiermee worden de drie klanten weergegeven die de minste producten hebben besteld:

db.customers.find (
    { }
    { "name" : 1 }
).limit ( 2 ) .sort ( { "units" : 1 } )
shell
Tip

Om een specifiek document in uw database te vinden, kunt u de MongoDB findONE-methode gebruiken. We leggen deze methode uitgebreider uit in een ander artikel in onze digitale gids.

Ga naar hoofdmenu