2012-05-03 2 views
6

У меня есть эта схема:

article: { 
    subject, 
    comments: [] 
} 

, если у меня есть 8 комментариев, и запрос

article.find({}, { 
    comments: { 
     $slice: [ -10, 5 ] 
    } 
}); 

И я получаю комментарии от индекса 0 до индекса 4,
, но я хочу только комментарии от индекса 0 до индекса 2, который будет возвращен из-за пейджинга.
(страницы 1 $ ломтик [-5, 5] из индекса 3 к индексу 7, страница 2 $ ломтика [-10, 5] из индекса 0 до индекса 2)

теперь я должен передать другой параметр «lastId «сравнить каждый комментарий и удалить« _id »<« lastId », но я думаю, что он немного взломан.

У кого-нибудь есть хорошее решение для этого?

ответ

13

Итак, я собираюсь сказать, что вы должны переключить свою схему, чтобы оставить комментарии в виде отдельных документов, так как это несвязанный массив, и это сделает ваши запросы более эффективными. Я объясню это.

Когда вы добавляете внедренные документы в массив, который не является фиксированным размером, mongoDB потенциально может перемещать документ по мере его роста, изменяя коэффициент заполнения и вызывая фрагментацию (коэффициент заполнения - это предположение со стороны mongodb's, как большой ваш документ будет расти, он выделяет больше места для этого случая).

Вы также ограничены документом 16MB pr, поэтому представьте, если вы получите сумасшедший популярный поток или вы решите продлить комментарии с другими метаданными, это возможно, что вы нарушите этот барьер. Получение большого документа также дорого и требует много времени.

В целом встроенные документы великолепны, если они не являются несвязанными массивами. Таким образом, сохранение списка из 10 лучших комментариев будет отлично работать, но комментарии 1000+ будут плохими.

Есть некоторые хорошие презентации под

http://www.10gen.com/presentations/mongodb-berlin/2012/10-key-performance-indicators http://www.10gen.com/presentations/mongosv-2011/schema-design-by-example

Я думаю, что есть больше работы, в ближайшее время на проектирование схемы, которая будет более полезным в долгосрочной перспективе. Я думаю, что это самое сложное, чтобы быть честным. Я знаю, мне потребовалось некоторое время, чтобы обернуть голову вокруг различий от реляционных моделей.

+0

комментарии не длинный текст и большая сумма, поэтому 16 МБ на документ вполне достаточно. и о чем я действительно беспокоюсь - это гибкость и эффективность. так что это действительно действительно плохой способ хранить комментарии (или любой другой несвязанный массив) в качестве встроенного документа, верно? – Kevin

+0

Ну а какие-то запросы очень сложно сделать со встроенными документами, например, дать мне все комментарии конкретного пользователя. Так что в целом это хороший случай денормализации. – christkv

+0

Я согласен с тобой. Но я также думаю, что встроенные или нет, зависит от того, что нужно приложениям, если мне не нужны комментарии к комментариям по другим полям, но только по этой статье (другими словами, комментарии всегда появляются в статье), я предпочитаю встраивать массив комментариев в документе статьи. – Kevin