sql >> Base de Datos >  >> NoSQL >> MongoDB

Mongoose:¿Cómo poblar una población profunda de 2 niveles sin poblar campos de primer nivel? en mongodb

Como ávido fanático de mongodb, le sugiero que use una base de datos relacional para datos altamente relacionales; para eso está diseñada. Está perdiendo todos los beneficios de mongodb cuando tiene que realizar más de 3 consultas para obtener un solo objeto.

Peeeeeero , se que ese comentario caerá en saco roto. Su mejor apuesta es ser lo más consciente posible sobre el rendimiento. Su primer paso es limitar los campos al mínimo requerido. Esta es solo una buena práctica incluso con consultas básicas y cualquiera motor de base de datos:solo obtenga los campos que necesita (p. ej., SELECT * FROM ===malo... ¡simplemente deja de hacerlo!). También puede intentar hacer consultas ajustadas para ayudar a ahorrar una gran cantidad de trabajo de posprocesamiento que Mongoose hace con los datos. No probé esto, pero debería funcionar...

SchemaA.find({}, 'field1 fieldB', { lean: true })
.populate({
    name: 'fieldB',
    select: 'fieldC',
    options: { lean: true }
}).exec(function (err, result) {
    // not sure how you are populating "result" in your example, as it should be an array, 
    // but you said your code works... so I'll let you figure out what goes here.
});

Además, una forma muy "mongo" de hacer lo que quiere es guardar una referencia en SchemaC de vuelta a SchemaA. Cuando digo la forma "mongo" de hacerlo, debe romper con sus años de pensar en consultas de datos relacionales. Haga lo que sea necesario para realizar menos consultas en la base de datos, incluso si requiere referencias bidireccionales y/o duplicación de datos.

Por ejemplo, si tuviera un esquema de Libro y un esquema de Autor, probablemente guardaría el nombre y apellido del autor en la colección Libros, junto con una referencia _id al perfil completo en la colección Autores. De esa manera, puedo cargar mis libros en una sola consulta, seguir mostrando el nombre del autor y luego generar un hipervínculo al perfil del autor:/author/{_id} . Esto se conoce como "desnormalización de datos", y se sabe que provoca acidez estomacal en las personas. Intento usarlo en datos que no cambian muy a menudo, como los nombres de las personas. En el caso de que un nombre cambie, es trivial escribir una función para actualizar todos los nombres en varios lugares.