Как да намерите схема на колекция в MongoDB

MEAN стека е една от най-взискателните колекции от технологии в наши дни. Тя включва MongoDB ExpressJS AngularJS и NodeJS. Но независимо дали работите върху пълния стек или MongoDB сами, в един момент бихте искали да архивирате и възстановите вашата база данни. Данните, които се архивират в MongoDB, обикновено са под формата на bson / json и могат да бъдат възстановени с помощта на команди, лесно достъпни в документи и платформи на MongoDB като StackOverflow.

Докато възстановяването и архивирането на данни в MongoDB работи като чар, понякога може да искате да импортирате резервно копие на MongoDB. И за да продължите да работите върху данните, трябва да знаете схеми на колекциите.

Ако имате късмет, ще имате файловете на схемата, но ако нямате такива, все още можете да разберете схемата на колекцията, като използвате данните, които се намират в колекцията. Нека ви кажа как.

Можем да получим обекта на схемата / първия документ на колекцията, като използваме:

var schemaObj = db.users.findOne ();

Сега, за да отпечатаме схемата, можем да разпечатаме ключа на всяко свойство на schemaObj и типа на свойството (например низ / номер и т.н.). За това нека напишем функция, която приема schemaObj като вход и отпечатва необходимата информация на конзолата.

функция printSchema (obj) {
        за (var ключ в obj) {
            печат (тире, ключ, typeof obj [клавиш]);
        }
    };

Горната функция разпечатва схемата, а изходът е:

Това е яко. Така ли е? Но изглежда като "вход в инфо", "настройки", "роли" и "мета" са обекти и могат да имат няколко под-свойства. Може да искаме и тази информация (т.е. разпечатайте вложени схеми). За това нека подобрим функцията „printSchema“ и оператора за извикване на функция, както следва:

функция printSchema (obj, тире) {
        за (var ключ в obj) {
            печат (тире, ключ, typeof obj [клавиш]);
            if (typeof obj [key] == "обект") {
                printSchema (obj [клавиш], отстъп + "\ t")
            }
        }
    };
printSchema (schemaObj, "");

Горният код отпечатва следния изход сега:

Страхотен! Но мога да видя и функции в горния изход. Ако не го искаме, можем да го пропуснем, като променим функцията малко по следния начин:

функция printSchema (obj, тире) {
    за (var ключ в obj) {
        if (typeof obj [key]! = "function") {// не искаме да печатаме функции
           печат (тире, ключ, typeof obj [клавиш], тип);
            if (typeof obj [key] == "object") {// ако текущото свойство е от тип обект, отпечатайте и неговите под-свойства
                printSchema (obj [клавиш], отстъп + "\ t");
            }
        }
    }
};

Нашата функция printSchema сега дава следния изход:

За предварително разработчици: (Тъй като това е забавно: P)

Може да забележите, че „_create“, „_last_modified“ са обекти. Но обикновено те са всъщност случаи на обект Date. По същия начин свойството „роли“ изглежда изглежда като масив от низове. Можем да получим действителния тип данни, като допълнително променим функцията си printSchema, както следва:

функция printSchema (obj, тире) {
    за (var ключ в obj) {
        if (typeof obj [key]! = "function") {// не искаме да печатаме функции
            var specificDataTypes = [Дата, масив]; // посочете конкретните типове данни, които искате да проверите
            var type = "";
            за (var i в specificDataTypes) {// прескачане през [Date, Array]
                if (obj [key] instanceof specificDataTypes [i]) {// ако текущото свойство е екземпляр от DataType
                        type = "== is_" + specificDataTypes [i] .name + "=="; // получи името си
                        прекъсване;
                }
            }
            печат (тире, ключ, typeof obj [клавиш], тип); // печат за конзола (например обект на роли is_Array)
            if (typeof obj [key] == "object") {// ако текущото свойство е от тип обект, отпечатайте и неговите под-свойства
                printSchema (obj [клавиш], отстъп + "\ t");
            }
        }
    }
};
printSchema (широкоъгълен изглед)

По-долу е крайният изход за нашия пример на потребителска схема:

Ето го. Можете успешно да извлечете схемата от документа на колекция в MongoDB, като използвате горния метод. И ще отпечата пълната йерархия на схемата, без значение колко е вложена схемата.

Използване на извадка след извличане на схема ще бъде следното, използвайки Mongoose в NodeJS:

var userSchema = new mongoose.Schema ({
 loginInfo: {
     providerID: {type: String},
     providerKey: {type: String}
 }
 firstName: {type: String},
 lastName: {type: String},
 fullName: {type: String},
 имейл: {type: String},
 парола: {type: String},
 сол: {type: String},
 настройки: {
     предпочитан език: {type: String},
     isReceiveNotification: {type: Boolean},
     isReceiveEmail: {type: Boolean},
 }
 роли: {type: Array},
 състояние: {type: String},
 мета: {
     _member: {type: String},
     _version: {тип: Номер},
     _create_by: {type: String},
     _create: {type: Date},
     _last_modified: {тип: Дата},
     _owner: {type: String},
     _modified_by: {type: String},
 }
});

Пробването на нови технологии винаги е забавно. Понякога лесно влизате в играта, но когато се задържате на проблем и не можете да намерите решение повярвайте ми, това е истинска болка. Сериозно! Наздраве за всички, които предлагат решения за най-лудите проблеми, с които се сблъскваме по време на развитието.