Cómo encontrar el esquema de una colección en MongoDB

MEAN stack es una de las colecciones de tecnologías más exigentes en estos días. Incluye MongoDB ExpressJS AngularJS y NodeJS. Pero si trabaja en la pila completa o MongoDB solo, en algún momento querrá hacer una copia de seguridad y restaurar su base de datos. Los datos que se respaldan en MongoDB generalmente tienen la forma de bson / json y se pueden restaurar utilizando comandos fácilmente disponibles en los documentos y plataformas de MongoDB como StackOverflow.

Si bien la restauración y copia de seguridad de datos en MongoDB funciona de maravilla, a veces es posible que desee importar una copia de seguridad de MongoDB. Y para seguir trabajando en los datos, debe conocer los esquemas de las colecciones.

Si tiene suerte, tendrá los archivos de esquema, pero si no los tiene, aún puede encontrar el esquema de la colección utilizando los datos que residen dentro de la colección. Déjame decirte cómo.

Podemos obtener el objeto de esquema / primer documento de la colección usando:

var schemaObj = db.users.findOne ();

Ahora para imprimir el esquema, podemos imprimir la clave de cada propiedad de schemaObj y el tipo de propiedad (por ejemplo, cadena / número, etc.). Para eso, vamos a escribir una función que tome schemaObj como entrada e imprima la información requerida en la consola.

función printSchema (obj) {
        para (clave var en obj) {
            print (sangría, clave, tipo de obj [clave]);
        }
    };

La función anterior imprime el esquema y la salida es:

Eso es genial. ¿Correcto? Pero parece que "loginInfo", "settings", "roles" y "meta" son objetos y pueden tener varias subpropiedades. También podríamos querer esa información (es decir, imprimir esquemas anidados). Para eso, vamos a mejorar nuestra función "printSchema" y la declaración de llamada de la función de la siguiente manera:

función printSchema (obj, sangría) {
        para (clave var en obj) {
            print (sangría, clave, tipo de obj [clave]);
            if (typeof obj [clave] == "objeto") {
                printSchema (obj [clave], sangría + "\ t")
            }
        }
    };
printSchema (schemaObj, "");

El código anterior imprime el siguiente resultado ahora:

¡Excelente! Pero también puedo ver funciones en la salida anterior. Si no lo queremos, podemos omitirlos modificando la función un poco de la siguiente manera:

función printSchema (obj, sangría) {
    para (clave var en obj) {
        if (typeof obj [key]! = "function") {// no queremos imprimir funciones
           print (sangría, clave, tipo de obj [clave], tipo);
            if (typeof obj [key] == "object") {// si la propiedad actual es del tipo de objeto, imprima también sus propiedades secundarias
                printSchema (obj [clave], sangría + "\ t");
            }
        }
    }
};

Nuestra función printSchema ahora da el siguiente resultado:

Para desarrolladores avanzados: (Dado que esto es divertido: P)

Puede notar que "_created", "_last_modified" son objetos. Pero generalmente son en realidad instancias del objeto Date. Del mismo modo, la propiedad "roles" parece que es una matriz de cadenas. Podemos obtener el tipo de datos real modificando aún más nuestra función printSchema de la siguiente manera:

función printSchema (obj, sangría) {
    para (clave var en obj) {
        if (typeof obj [key]! = "function") {// no queremos imprimir funciones
            var especificoDataTypes = [Fecha, matriz]; // especifica los tipos de datos específicos que deseas verificar
            var type = "";
            for (var i en especificoDataTypes) {// looping over [Date, Array]
                if (obj [key] instanceof especificoDataTypes [i]) {// si la propiedad actual es instancia del DataType
                        type = "== is_" + specificDataTypes [i] .name + "=="; // obtener su nombre
                        rotura;
                }
            }
            print (sangría, clave, tipo de obj [clave], tipo); // imprimir en la consola (por ejemplo, el objeto de roles es_Array)
            if (typeof obj [key] == "object") {// si la propiedad actual es del tipo de objeto, imprima también sus propiedades secundarias
                printSchema (obj [clave], sangría + "\ t");
            }
        }
    }
};
printSchema (gran angular)

A continuación se muestra el resultado final de nuestro ejemplo de esquema de usuario:

Aquí está. Puede extraer con éxito el esquema del documento de una colección en MongoDB utilizando el método anterior. E imprimirá la jerarquía completa del esquema sin importar cuán anidado esté el esquema.

Un uso de muestra después de extraer el esquema sería el siguiente usando Mongoose en NodeJS:

var userSchema = new mongoose.Schema ({
 loginInfo: {
     providerID: {type: String},
     providerKey: {type: String}
 },
 firstName: {type: String},
 lastName: {type: String},
 fullName: {type: String},
 correo electrónico: {type: String},
 contraseña: {type: String},
 sal: {type: String},
 configuración: {
     preferredLang: {type: String},
     isReceiveNotification: {type: Boolean},
     isReceiveEmail: {type: Boolean},
 },
 roles: {type: Array},
 estado: {tipo: cadena},
 meta: {
     _member: {type: String},
     _version: {type: Number},
     _created_by: {type: String},
     _created: {type: Date},
     _last_modified: {type: Date},
     _owner: {type: String},
     _modified_by: {type: String},
 }
});

Probar nuevas tecnologías siempre es divertido. A veces entras fácilmente en el juego, pero cuando te quedas atrapado en un problema y no puedes encontrar una solución, créeme, es un DOLOR real. ¡Como serio! Saludos a todos brindando soluciones para los problemas más locos que enfrentamos durante el desarrollo.