Я создаю модуль обмена сообщениями в существующее веб-приложение. Мы хранение сообщений в Монго со структурой данных, что-то выглядит как:Монгинация с разбивкой по страницам
{
id: "",
inResponseToMessageId: ""
to: []
cc: []
bcc: []
subject: ""
body: ""
owners: [{id:4, status:"read", folder:"inbox"}, {id:1, status:'unread', folder:'inbox'}]
dateSent:
}
клиент хотел бы, чтобы иметь возможность отображать сообщения как вид на разговоре и одноплодного зрения.
У меня возникли проблемы, выясняя эффективный запрос, который может результаты
- Возврата сгруппированные по ветке сообщений.
- Хорошо работать с разбиением на страницы.
- Сортировка по дате и теме.
Я могу изменить структуру данных, но мне нужно, чтобы это хорошо работало.
Ниже приведены несколько возможных решений, но все они, кажется, не дотягивают: сообщения
- магазин как дети объекта потока.
- Добавить threadId для каждого сообщения, а затем запросить и сгруппировать по threadId.
- Создайте некоторый тип объекта метаинформации, который помогает.
Проблема со стандартным Монго group
или $group
функции является то, что я предполагаю, что это будет работать очень плохо, когда коллекция велика. Мы ожидаем, что в коллекции будут сотни миллионов сообщений.
Я знаю, что это не то, что вы просили, но: является ли Монго действительно требованием или у вас есть гибкость при выборе хранилища документов? Проблема, которую вы описываете, на самом деле является реляционной ... Если вы можете выбрать другое решение для хранения, я бы предложил OrientDB вместо Mongo, поскольку он может выступать в качестве хранилища документов, и ваши руки не будут привязаны, как сейчас. , Независимо от того, что вы решили пойти, я предлагаю вам запустить определенные тесты, чтобы убедиться, что ваши ожидания соответствуют реальной производительности! – easuter
@easuter. Спасибо за ответ. Я рад использовать реляционный db, но я не думаю, что он решит проблему. Можете ли вы рассказать о том, как поможет реляционная модель? – Jakobovski
Во-первых, извините за задержку в ответе! Хранилища документов, такие как Mongo, великолепны, если вы храните строго иерархические данные, и когда вы уверены, что ваша схема (heh ...) будет статичной навсегда. Классическим примером этой проблемы было [первоначальное использование Diaspora MongoDB в качестве хранилища проекта] (http://tinyurl.com/mzux7tq), я очень рекомендую его прочитать. Возвращаясь к этому последнему пункту: вы не знаете наверняка, изменится ли в будущем ваши требования клиента, и к тому времени вы можете «закодировать себя в угол», сделав переход на что-то еще очень болезненным. – easuter