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/.

Это позволит вам отфильтровывать части объекта фильма, которые вам не интересны.

Другие вопросы по тегам