sql >> Database teknologi >  >> NoSQL >> MongoDB

Forespørgsel efter dokumenter, der har et internt underfelt med en given værdi

Dette har altid været muligt med MongoDB, fordi der altid har været mulighed for at konstruere forespørgselsbetingelser ved hjælp af JavaScript-evaluering :

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

Hvor det korrekt vil returnere de dokumenter, der matcher betingelsen her, ved at søge på de mulige nøgler i dokumentet for den påkrævede værdi.

Men det er egentlig ikke et spørgsmål om "mulig", men mere et af "er dette virkelig en god idé" , hvor det grundlæggende svar er "Nej".

Databaser er vægelsindede dyr, der godt kan lide at optimere med ting som indekser og sådan, såvel som deres eget forventede operatørsæt for at gøre søgning så effektiv som muligt at bruge. Så ja, du kan gå gennem en sprogfortolker, der effektivt evaluerer en kodet tilstand på tværs af hvert dokument, eller du kan genoverveje dit designmønster.

Databaser elsker "orden", så giv det noget, da der er en simpel organiseret omstrukturering af de data, du foreslår:

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

Organiseret på den måde bliver forespørgslen så enkel som:

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

Og kan selvfølgelig understøtte og bruge et indeks på enhver af disse egenskaber for underdokumentet i arrayet.

MongoDB er trods alt en "database", og som alle databaser er den mest optaget af "værdierne" af dens egenskaber frem for at søge ved at bruge navnene på dens "nøgler". Så ting, der repræsenterer meningsfulde "data" bør ikke være en del af navnet på en "nøgle", men de bør snarere være "værdien" af en "nøgle" som en "identifier", som vist ovenfor.

At have en ensartet sti til de data, du ønsker at forespørge på, er den optimale måde at arbejde med data inde i MongoDB. Brug af en struktur, hvor nøglenavne konstant ændrer sig, kan ikke gennemløbes af andet end kørende kode, og det er så meget langsommere og værre for ydeevnen end at bruge de oprindelige operationer og faciliteter såsom indekser.




  1. MongoDB, fjern objekt fra array

  2. Håndtering af konflikter i find, modificer, gem flow i MongoDB med Mongoose

  3. MongoDB tændt med Docker kunne ikke oprette forbindelse til serveren [localhost:27017] ved første forbindelse

  4. hvordan man konverterer hex streng til ObjectId i Python