Хранение встроенных комментариев и предотвращение накладных расходов в MongoDB - PullRequest
1 голос
/ 30 июля 2010

Позвольте мне объяснить мою проблему, и, надеюсь, кто-то может дать хороший совет.

В настоящее время я работаю над веб-приложением, которое хранит информацию и метаданные для большого количества приложений.Для каждого приложения может быть от 10 до 100 комментариев, привязанных к приложению, и идентификатор версии приложения.Я использую MongoDB из-за необходимости легкой масштабируемости и скорости в будущем.Я прочитал, что комментарии должны быть встроены в коллекцию по соображениям производительности чтения, но я не уверен, что это работает в моем случае.Я прочитал в другом посте:

В общем, если вам нужно работать с данным набором данных самостоятельно, сделайте его коллекцией.By: @kb

В моем случае, однако, мне не нужно работать над коллекцией самостоятельно.Позвольте мне объяснить дальше.У меня будет таблица приложений (которую можно отфильтровать), и я буду динамически загружать записи при прокрутке или фильтрации списка приложений.Если я встраиваю комментарии в коллекцию приложения, я отправляю ВСЕ комментарии, когда динамически загружаю запись приложения в таблицу.Тем не менее, я хотел бы сделать «ленивую загрузку», так как я хочу загружать комментарии только тогда, когда пользователь запрашивает их просмотр (нажав на запись в таблице).может выглядеть следующим образом

| app name | version | rating | etc. | view comments |
------------------------------------------------------
| app1     | v.1.0   | 4 star | etc. | click me!     |
| app2     | v.2.4.5 | 3 star | etc. | click me!     |
| ...

Мой вопрос: что будет более эффективным?Читается ли достаточно быстро на MongoDB, так что не имеет значения, что я получаю все комментарии с каждым приложением?Если пользователь не отфильтровал ни одно из приложений и прокрутил его до конца, он может загрузить где-то от 125 до 250 тыс. Записей / приложений.

1 Ответ

2 голосов
/ 30 июля 2010

Я бы предложил подумать более конкретно о вашем запросе - вы указываете, какие части объекта вы хотите вернуть.Это должно позволить вам избежать лишних затрат на получение множества встроенных комментариев, когда вы заинтересованы только в отображении некоторых конкретных битов информации о приложении.

Вы можете сделать что-то вроде: db.collection.find({ appName : 'Foo'}, {comments : 0 });, чтобы получитьобъект приложения с appName Foo, но специально исключает объект comments (более вероятный массив объектов), встроенный в него.

Из документов MongoDB

Извлечение подмножества полей. По умолчанию при операции поиска возвращается весь документ / объект.Однако мы также можем запросить, чтобы были возвращены только определенные поля.Обратите внимание, что поле _id всегда возвращается автоматически.

// select z from things where x=3
db.things.find( { x : 3 }, { z : 1 } );

Вы также можете удалить определенные поля, которые, как вы знаете, будут большими:

// get all posts about mongodb without comments
db.posts.find( { tags : 'mongodb' }, { comments : 0 } );

РЕДАКТИРОВАТЬ Также запомните функцию limit(n) для извлечения только n приложений одновременно.Например, получение n=50 приложений без их комментариев будет:

db.collection.find({}, {comments : 0 }).limit(50);
...