Проводка этот ответ после того, как некоторые другие так Я повторяю некоторые из упомянутых вещей. Пожалуйста, примите первый подходящий ответ, а не этот.
Это говорит о том, что нужно учитывать несколько вопросов. Рассмотрим эти три вопроса:
- Всегда ли вы запрашиваете все комментарии при каждом запросе сообщения?
- Вы хотите запросить непосредственно комментарии (например, запросить комментарии для конкретного пользователя)?
- Будет ли ваша система иметь относительно низкое использование?
Если на все вопросы можно ответить да, вы можете встроить массив комментариев. Во всех других сценариях вам, вероятно, понадобится отдельная коллекция для хранения ваших комментариев.
Прежде всего, вы можете обновлять и удалять комментарии атомарно безопасным способом (см. Обновления с помощью позиционных операторов), но есть некоторые вещи, которые вы не можете сделать, такие как вставки на основе индексов.
Основная проблема использования встроенных массивов для любой крупной коллекции - проблема с обновлением. MongoDB резервирует определенное количество дополнений (см. db.col.stats().paddingFactor
) на один документ, чтобы позволить ему расти по мере необходимости. Если у вас закончится это дополнение (и это часто будет в вашем случае), ему придется перемещать этот постоянно растущий документ на диске. Это делает обновления на порядок медленнее и, следовательно, является серьезной проблемой для серверов с высокой пропускной способностью. Связанная, но немного менее важная проблема - это пропускная способность. Если у вас нет другого выбора, кроме как запросить весь пост со всеми его комментариями, даже если вы показываете только первые 10, вы потратите немало трафика, что может быть проблемой для облачных сред (вы можете использовать $ чтобы избежать некоторых из них).
Если вы хотите идти встроенные вот ваши основные опс:
Добавить комментарий:
db.posts.update({_id:[POST ID]}, {$push:{comments:{commentId:"remon-923982", author:"Remon", text:"Hi!"}}})
Обновить комментарий:
db.posts.update({_id:[POST ID], 'comments.commentId':"remon-923982"}, {$set:{'comments.$.text':"Hello!"}})
Удалить комментарий
db.posts.update({_id:[POST ID], 'comments.commentId':"remon-923982"}, {$pull:{comments:{commentId:"remon-923982"}}})
Все это я thods являются безопасными параллелизма, потому что критерии обновления являются частью блокировки записи (процесса).
При всем том, что вы, вероятно, хотите получить специальную коллекцию для своих комментариев, но это происходит со вторым выбором. Вы можете хранить каждый комментарий в выделенном документе или использовать комментарии кодов, скажем, 20-30 комментариев каждый (подробно описано здесь http://www.10gen.com/presentations/mongosf2011/schemascale). У этого есть преимущества и недостатки, поэтому вам решать, какой подход лучше всего подходит для того, что вы хотите сделать.Я бы пошел за ведрами, если ваши комментарии за сообщение могут превышать пару сотен из-за производительности o (N) метода курсора sk (N), который вам понадобится для подкачки. Во всех остальных случаях просто переходите с комментариями к документообороту. Это наиболее гибко с запросом на комментарии для других случаев использования.
Рад, что кто-то поднял проблему с пропускной способностью. Это проблема реального мира, которая часто игнорируется людьми, разрабатывающими решения для такого рода проблем;). Единственное исключение - если вам всегда нужно получать все комментарии для каждого сообщения в блоге, которое вы извлекаете из системы. –