sql >> Database >  >> NoSQL >> MongoDB

Zoek naar documenten met een intern subveld van een bepaalde waarde

Dit is altijd mogelijk geweest met MongoDB omdat er altijd de mogelijkheid is geweest om queryvoorwaarden te maken met behulp van JavaScript-evaluatie :

db.attrs.find(function() {
    var attrs = this.attrs;
    return Object.keys(attrs).some(function(key) {
       return attrs[key].value === "14"
    });
})

Waar dat correct de documenten zal retourneren die voldoen aan de voorwaarde hier door de mogelijke sleutels in het document te doorzoeken op de vereiste waarde.

Maar het is niet echt een vraag over "mogelijk", maar meer een van "is dit echt een goed idee" , waarvoor het basisantwoord "Nee" is.

Databases zijn wispelturige beesten die graag optimaliseren met zaken als indexen en dergelijke, evenals hun eigen verwachte operatorset om het zoeken zo efficiënt mogelijk te maken. Dus ja, je kunt een taaltolk gebruiken die effectief brute kracht een gecodeerde voorwaarde in elk document evalueert, of je kunt je ontwerppatroon heroverwegen.

Databases houden van "ordenen", dus geef het wat, want de gegevens die u voorstelt, hebben een eenvoudige, georganiseerde herindeling:

{
    "attrs" : [
        { "key": "A1", "type" : "T1", "value" : "13" },
        { "key": "A2", "type" : "T2", "value" : "14" }
     ]
}

Op die manier georganiseerd wordt de vraag zo eenvoudig als:

db.attrs.find({ "attrs.value": "14" })

En kan natuurlijk een index ondersteunen en gebruiken op elk van die eigenschappen van het subdocument in de array.

MongoDB is tenslotte een "database", en zoals alle databases houdt het zich meer bezig met de "waarden" van zijn eigenschappen dan met zoeken met de namen van zijn "sleutels". Dus dingen die betekenisvolle "gegevens" vertegenwoordigen, zouden geen deel moeten uitmaken van de naam van een "sleutel", maar zouden eerder de "waarde" van een "sleutel" moeten zijn als een "identificator", zoals hierboven aangetoond.

Een consistent pad hebben naar de gegevens waarop u een query wilt uitvoeren, is de optimale manier om met gegevens binnen MongoDB te werken. Een structuur gebruiken waarin sleutelnamen voortdurend veranderen, kan niet worden doorkruist door iets anders dan het uitvoeren van code, en dat is zo veel langzamer en slechter voor de prestaties dan het gebruik van de native bewerkingen en faciliteiten zoals indexen.




  1. MongoDB neemt mlab over - Wat zijn de verschillende MongoDB-hostingalternatieven?

  2. Hoe dit resultaat te krijgen met aggregaat in mongoDB

  3. $replaceRoot in mongodb-aggregatie

  4. Vermijd huidige URL-tekenreeksparser is verouderde waarschuwing door useNewUrlParser in te stellen op true