2011-05-20 12 views
5

Soy nuevo con MongoDB. Tengo una pregunta de diseño sobre el rendimiento de MongoDB. Digamos que tengo películas de la clase con dos propiedades, nombre y director. También quiero etiquetar esta clase de película. ¿Es mejor agregar una nueva propiedad de cadenas [] a esta clase, o crear una nueva clase MovieTags? Sé que consultaré mucho estas etiquetas porque usaré un autocompletado en la interfaz de usuario. Para esta función de autocompletar solo necesito las etiquetas, no el objeto de película. ¿Qué opción es mejor? agregar una propiedad de cadenas [] o referencia a una colección de MovieTags? Pensando en el rendimiento ... por supuesto, en ambos casos se realizará la indexación.diseño MongoDB - etiquetas

¿Debo usar un MapReduce? ¿Solo para seleccionar las etiquetas, para la función de autocompletar si utilizo un objeto embozado de cadena []? ¿Cómo?

Gracias!

+0

posible duplicado de [el diseño del esquema mongodb de blogs] (http://stackoverflow.com/questions/5224811/mongodb-schema-design-for-blogs) –

+0

posible duplicado de [Cómo implementar etiquetas de correos en Mongo?] (http://stackoverflow.com/questions/ 8455685/cómo-a-instrumento-post-tags-en-mongo) –

Respuesta

5

probablemente iría con un esquema de este tipo, que almacena las etiquetas en un campo de matriz de cadena:

db.movies.insert({ 
    name: "The Godfather", 
    director: "Francis Ford Coppola", 
    tags: [ "mafia", "wedding", "violence" ] 
}) 

db.movies.insert({ 
    name: "Pulp Fiction", 
    director: "Quentin Tarantino", 
    tags: [ "briefcase", "violence", "gangster" ] 
}) 

db.movies.insert({ 
    name: "Inception", 
    director: "Christopher Nolan", 
    tags: [ "dream", "thief", "subconscious" ] 
}) 

Usted no necesita un mapa-reducir para este tipo de consulta. Mediante la integración de las etiquetas dentro del documento de la película se puede tomar ventaja de la función de MongoDB multikey, y encontrar las películas con una etiqueta determinada utilizando un solo find() consulta como esta:

db.movies.find({ tags: "dream" }) 

Y como usted ha dicho, también vale la pena añadir un índice a la matriz multichip para mejorar el rendimiento de la consulta:

db.movies.ensureIndex({ tags: 1 }) 
+0

el problema, con esto es que se selecciona el objeto de película agujero, cuando sólo necesito las etiquetas para el autocompletado. ¿Estás seguro de que esto es más rápido? – elranu

+5

Esto no parece responder realmente a su pregunta. ¿Cómo haría para obtener una lista distinta de etiquetas usadas en toda la colección de películas? – efdee

+0

Esto le dará una lista distinta de etiquetas: 'db.test.distinct ('tags')' – Pek

Cuestiones relacionadas