2012-05-03 19 views
6

tengo este esquema:

article: { 
    subject, 
    comments: [] 
} 

si tengo 8 comentarios y consulta

article.find({}, { 
    comments: { 
     $slice: [ -10, 5 ] 
    } 
}); 

Y consigo los comentarios de índice 0 para indexar 4,
pero solo quiero que se devuelvan los comentarios del índice 0 al índice 2 debido a la paginación.
(página 1 $ slice [-5, 5] del índice 3 al índice 7, página 2 $ slice [-10, 5] del índice 0 al índice 2)

ahora tengo que pasar otro parámetro "lastId "para comparar cada comentario y eliminar ese" _id "<" lastId ", pero creo que es un poco hacky.

¿Alguien tiene una buena solución para esto?

Respuesta

13

Así que voy a decir que debe cambiar su esquema para dejar comentarios como documentos separados, ya que se trata de una matriz independiente y esto hará que sus consultas sean más eficientes. Lo explicaré.

Cuando agrega documentos incrustados a una matriz que no es de tamaño fijo, mongoDB necesitará mover el documento a medida que crece, cambiando el factor de relleno y causando fragmentación (el factor de relleno es una suposición del lado de mongodb grande su documento crecerá, preasigna más espacio para ese caso).

También está limitado a un documento de 16MB por lo que imagine que si obtiene un hilo popular loco o decide ampliar los comentarios con otros metadatos, es posible que rompa esa barrera. Recuperar un documento grande también es costoso y lleva mucho tiempo.

En general, los documentos incrustados son geniales si no son matrices independientes. Así que mantener una lista de los 10 mejores comentarios funcionará bien, pero mantener más de 1000 comentarios es malo.

hay algunas buena presentación bajo

http://www.10gen.com/presentations/mongodb-berlin/2012/10-key-performance-indicators http://www.10gen.com/presentations/mongosv-2011/schema-design-by-example

Creo que hay más trabajo que viene pronto en el diseño del esquema que será más útil a largo plazo. Creo que es lo más difícil para ser honesto. Lo sé, me tomó un tiempo comprender las diferencias de los modelos relacionales.

+0

los comentarios no son texto largo y gran cantidad, por lo que 16 MB por documento es suficiente. y lo que realmente me preocupa es la flexibilidad y la eficiencia. entonces, realmente es una mala forma de almacenar comentarios (o cualquier otra matriz unida) como documento incrustado, ¿verdad? – Kevin

+0

Bueno, algún tipo de consultas son muy difíciles de hacer con documentos incrustados, como darme todos los comentarios de un usuario específico. Entonces, en general, este es un buen caso para la desnormalización. – christkv

+0

Estoy de acuerdo. Pero también creo que incrustado o no depende de lo que necesita la aplicación, si no necesito comentarios de consulta por otros campos, sino solo por el artículo (en otras palabras, los comentarios siempre aparecen con el artículo), prefiero incrustar la matriz de comentarios en el documento del artículo. – Kevin

Cuestiones relacionadas