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

Optimización del rendimiento del esquema MongoDB

Lo primero que viene a la mente aquí es:¿por qué almacenar una referencia le cuesta 5000 veces lo que cuesta almacenar en un subdocumento?

De acuerdo, mirando su esquema, creo que el mejor método es la recopilación separada de palabras, no de paquetes.

La primera bandera roja que vi es tu doble anidamiento aquí:

packages : [{
    package : {type: Schema.Types.ObjectId, ref: 'Packages'},
    from : {type : Schema.Types.ObjectId, ref :'Languages'},
    to : {type : Schema.Types.ObjectId, ref :'Languages'},
    words : [{
        word: {type: String},
        progress: {type: Number,default : 0}
    }]
}]

Las words será muy difícil trabajar con el subdocumento en la versión actual de MongoDB, normalmente 2-3 niveles de profundidad comienzan a tener problemas, especialmente con los operadores posicionales.

Ahora, considerando que siempre debe trabajar desde el valor más alto posible, puede obtener aquí:

También tienes que ir a considerar el costo de la vivienda este documento. Los operadores que necesitará estarán en memoria, como $pull , $push , $addToSet etc., lo que significa que todo el documento deberá serializarse y cargarse en las estructuras C++ nativas de MongoDB. Esta será una tarea que consumirá mucho dependiendo del tráfico a esos documentos.

Teniendo en cuenta su comentario:

simplemente pone otro clavo en el ataúd de incrustar las palabras dentro del documento principal del usuario. Teniendo en cuenta lo que dije en el párrafo anterior, esto no funcionará bien con el costo de usar operadores en memoria en las words matriz.

Esto funcionará mucho mejor si las palabras se dividen, $slice también es un operador en memoria y probablemente sufriría una disminución del rendimiento aquí.

Y esa es una respuesta razonada rápida. Estoy seguro de que podría explicar más sobre mi razón, pero eso debería ser suficiente.