MongoDB дизайн - теги
Я новичок в MongoDB. У меня есть вопрос дизайна, о производительности MongoDB. Допустим, у меня есть класс Movies с двумя свойствами: Name и Director. Также я хочу отметить этот класс фильма. Лучше добавить новое свойство строк [] в этот класс или создать новый класс MovieTags? Я знаю, что буду часто запрашивать эти теги, потому что я буду использовать автозаполнение в пользовательском интерфейсе. Для этой функции автозаполнения мне нужны только теги, а не объект Movie. Какой вариант лучше? добавить свойство строк [] или ссылку на коллекцию MovieTags? Думая о производительности... конечно, в обоих случаях будет выполнена индексация.
Должен ли я использовать MapReduce? Чтобы выбрать только теги, для функции автозаполнения, если я использую объект embebed string[]? Как?
Спасибо!
2 ответа
Я бы, вероятно, пошел с такой схемой, которая хранит теги в поле массива строк:
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" ]
})
Вам не нужно уменьшать карту для этого типа запроса. Внедрив теги в документ фильма, вы можете воспользоваться функцией мультиключа MongoDB и найти фильмы с данным тегом с помощью одного запроса find(), например:
db.movies.find( { tags: "dream" } )
И, как вы сказали, также стоит добавить индекс в массив multikey для повышения производительности запросов:
db.movies.ensureIndex( { tags: 1 } )
Вы всегда можете отфильтровать поля, которые возвращаются как часть результата запроса.
Ссылка на документы, в которых подробно описано, как это сделать, находится по http://docs.mongodb.org/manual/tutorial/query-documents/.
Это позволит вам отфильтровывать части объекта фильма, которые вам не интересны.