sql >> Databáze >  >> NoSQL >> MongoDB

Dotaz na dokumenty, které mají vnitřní podpole dané hodnoty

To bylo vždy možné s MongoDB, protože vždy existovala možnost konstruovat podmínky dotazu pomocí Vyhodnocení JavaScriptu :

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

Kde to správně vrátí dokumenty, které odpovídají podmínce, zde vyhledáním možných klíčů v dokumentu pro požadovanou hodnotu.

Ale ve skutečnosti to není otázka na "možné", ale spíše na "je to opravdu dobrý nápad" , pro kterou je základní odpověď „Ne“.

Databáze jsou nestálá zvířata, která se ráda optimalizují pomocí věcí, jako jsou indexy a podobně, stejně jako jejich vlastní očekávaná sada operátorů, aby bylo vyhledávání co nejúčinnější. Takže ano, můžete projít jazykovým tlumočníkem, který účinně hrubou silou vyhodnotí kódovanou podmínku v každém dokumentu, nebo můžete přehodnotit svůj návrhový vzor.

Databáze milují „pořádek“, tak mu dopřejte, protože data, která navrhujete, mají jednoduchou organizovanou restrukturalizaci:

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

Takto organizovaný dotaz se stává tak jednoduchým jako:

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

A může samozřejmě podporovat a používat index na kterékoli z těchto vlastností vnořeného dokumentu v poli.

MongoDB je koneckonců „databáze“ a jako všechny databáze se nejvíce zabývá „hodnotami“ svých vlastností, spíše než hledáním pomocí názvů svých „klíčů“. Věci, které představují smysluplná „data“, by tedy neměly být součástí názvu „klíče“, ale spíše by měly být „hodnotou“ „klíče“ jako „identifikátor“, jak je ukázáno výše.

Mít konzistentní cestu k datům, na která se chcete dotazovat, je optimální způsob práce s daty uvnitř MongoDB. Použití struktury, kde se názvy klíčů neustále mění, nelze procházet ničím jiným než spuštěným kódem, a to je o tolik pomalejší a horší z hlediska výkonu než použití nativních operací a prostředků, jako jsou indexy.




  1. Co znamená h v dokumentu oplog.rs?

  2. ABC NestJS:Průvodce pro začátečníky s MongoDB (Mongoose).

  3. Mongoose Mongodb dotazuje pole objektů

  4. Kdy vkládat dokumenty do Mongo DB