Kuinka löytää kokoelmakaavio MongoDB: stä

MEAN stack on yksi vaativimmista tekniikan kokoelmista nykyään. Se sisältää MongoDB ExpressJS AngularJS ja NodeJS. Mutta riippumatta siitä, työskenteletkö kokonaisen pinon vai yksin MongoDB: n kanssa, haluat joskus varmuuskopioida ja palauttaa tietokannan. MongoDB: ssä varmuuskopioidut tiedot ovat yleensä bson / json-muodossa ja ne voidaan palauttaa komennoilla, jotka ovat helposti saatavilla MongoDB: n dokumenteissa ja alustoilla, kuten StackOverflow.

Tietojen palauttaminen ja varmuuskopiointi MongoDB: ssä toimii kuin viehätys, joskus haluat ehkä tuoda MongoDB-varmuuskopion. Ja jatkaaksesi tietojen käsittelyä, sinun pitäisi tuntea kokoelmien mallit.

Jos sinulla on onnea, sinulla on skemaatiedostot, mutta jos sinulla ei ole niitä, voit silti selvittää kokoelman kaavan kokoelmassa olevien tietojen avulla. Anna minun kertoa sinulle kuinka.

Voimme saada schemaobjektin / kokoelman ensimmäisen asiakirjan käyttämällä:

var schemaObj = db.käyttäjät.findOne ();

Nyt tulostaaksesi kaavion, voimme tulostaa schemaObj: n jokaisen ominaisuuden avaimen ja ominaisuuden tyypin (esim. Merkkijono / numero jne.). Kirjoitetaan tätä varten funktio, joka ottaa schemaObj: n syötteenä ja tulostaa vaadittavat tiedot konsoliin.

toiminto printSchema (obj) {
        varten (var-näppäin obj) {
            tulosta (sisennys, avain, tyyppi obj [avain]);
        }
    };

Yllä oleva toiminto tulostaa kaavion ja tulosteena on:

Hyvä juttu. Oikea? Mutta näyttää siltä, ​​että “loginInfo”, “asetukset”, “roolit” ja “meta” ovat objekteja ja niillä voi olla useita aliominaisuuksia. Haluamme ehkä myös nämä tiedot (ts. Tulostaa sisäkkäiset skeemit). Parannetaan sitä varten “printSchema” -toimintoa ja funktiota kutsuttavaa lausuntoa seuraavasti:

toiminto printSchema (obj, luetelmakohta) {
        varten (var-näppäin obj) {
            tulosta (sisennys, avain, tyyppi obj [avain]);
            if (typeof obj [key] == "object") {
                printSchema (obj [avain], sisennys + "\ t")
            }
        }
    };
printSchema (schemaObj, "");

Yllä oleva koodi tulostaa seuraavan tuloksen:

Loistava! Mutta näen toiminnot myös yllä olevassa tuotossa. Jos emme halua sitä, voimme jättää ne pois tekemällä toimintoa hiukan seuraavasti:

toiminto printSchema (obj, luetelmakohta) {
    varten (var-näppäin obj) {
        if (typeof obj [key]! = "function") {// emme halua tulostaa toimintoja
           tulosta (sisennys, avain, tyyppi obj [avain], tyyppi);
            if (typeof obj [key] == "object") {// jos nykyinen ominaisuus on objektityyppiä, tulosta myös sen alaominaisuudet
                printSchema (obj [avain], sisennys + "\ t");
            }
        }
    }
};

PrintSchema-toiminto antaa nyt seuraavan tuloksen:

Edistyneille kehittäjille: (Koska tämä on hauskaa: P)

Saatat huomata, että ”_created”, “_last_modified” ovat esineitä. Mutta yleensä ne ovat tosiasiallisesti Date-esineitä. Samoin ”roolit” -ominaisuus näyttää siltä, ​​että se on merkkijono. Voimme saada todellisen tietotyypin muuttamalla edelleen printSchema-toimintoamme seuraavasti:

toiminto printSchema (obj, luetelmakohta) {
    varten (var-näppäin obj) {
        if (typeof obj [key]! = "function") {// emme halua tulostaa toimintoja
            var specificDataTypes = [Päivämäärä, taulukko]; // määritä tarkistetut tietotyypit
            var type = "";
            kohteelle (var i in specificDataTypes) {// luovuttaminen [päivämäärä, taulukko]
                if (obj [avain] esiintymä specificDataTypes [i]) {// jos nykyinen ominaisuus on DataType-esiintymä
                        type = "== is_" + specificDataTypes [i] .name + "=="; // hanki sen nimi
                        tauko;
                }
            }
            tulosta (sisennys, avain, tyyppi obj [avain], tyyppi); // tulosta konsoliin (esim. rooliobjekti on_Maailma)
            if (typeof obj [key] == "object") {// jos nykyinen ominaisuus on objektityyppiä, tulosta myös sen alaominaisuudet
                printSchema (obj [avain], sisennys + "\ t");
            }
        }
    }
};
printSchema (laajakulma)

Alla on lopullinen tulos esimerkillemme käyttäjän kaavasta:

Tässä se on. Voit purkaa kaavion onnistuneesti MongoDB: n kokoelman asiakirjasta yllä olevalla menetelmällä. Ja se tulostaa järjestelmän täydellisen hierarkian riippumatta siitä, kuinka sisäkkäinen järjestelmä on.

Näytteen käyttö mallin purkamisen jälkeen olisi seuraava käyttämällä Mongoose-sovellusta NodeJS: ssä:

var userSchema = uusi mongoose.Schema ({
 loginInfo: {
     palveluntarjoajan tunnus: {tyyppi: merkkijono},
     ProvideKey: {tyyppi: String}
 },
 etunimi: {tyyppi: merkkijono},
 sukunimi: {tyyppi: merkkijono},
 fullName: {type: String},
 sähköposti: {type: String},
 salasana: {tyyppi: merkkijono},
 suola: {tyyppi: merkkijono},
 asetukset: {
     preferLang: {type: String},
     isReceiveNotification: {type: Boolean},
     isReceptionEmail: {type: Boolean},
 },
 roolit: {tyyppi: Array},
 tila: {tyyppi: merkkijono},
 meta: {
     _jäsen: {tyyppi: merkkijono},
     _versio: {tyyppi: numero},
     _luotu_by: {tyyppi: String},
     _luotu: {tyyppi: päivämäärä},
     _last_modified: {type: Date},
     _omistaja: {tyyppi: merkkijono},
     _modified_by: {type: String},
 }
});

Uusien tekniikoiden kokeilu on aina hauskaa. Joskus pääset helposti peliin, mutta kun takertuit ongelmaan etkä löydä ratkaisua, usko minua, se on todellinen kipu. Vakavasti ottaen! Kippis kaikille tarjoamalla ratkaisuja raivoisimpiin ongelmiin, joita kohtaamme kehityksen aikana.