2012-05-03 20 views
6

mam ten schemat:

article: { 
    subject, 
    comments: [] 
} 

jeśli mam 8 komentarze i zapytania

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

i uzyskać komentarzy od indeksu 0 do indeksu 4
, ale chcę, aby komentarze z indeksu 0 do indeksu 2 były zwracane z powodu stronicowania.
(strona 1 $ plaster [-5, 5] od wskaźnika 3 do tabeli 7, strona 2 $ wycinka [-10, 5] w indeksie 0, indeks 2)

teraz muszą przejść inny parametr „lastId "Aby porównać wszystkie komentarze i usunąć" _id "<" lastId ", ale myślę, że jest trochę hacky.

Ktoś ma dobre rozwiązanie?

Odpowiedz

13

Powiem więc, że powinieneś zmienić swój schemat, zostawiając komentarze jako oddzielne dokumenty, ponieważ jest to tablica niezwiązana, co sprawi, że twoje zapytania będą bardziej efektywne. Wytłumaczę to.

Po dodaniu dokumentów osadzonych do macierzy, która nie ma stałego rozmiaru, mongoDB będzie musiał przesunąć dokument w miarę jego powiększania, zmieniając współczynnik wypełnienia i powodując fragmentację (współczynnik wypełnienia to domysły od strony mongody duży, twój dokument będzie rósł, wcześniej zajmuje więcej miejsca dla tego przypadku).

Jesteś również ograniczony do 16 MB dokumentu, więc wyobraź sobie, że jeśli masz zwariowany popularny wątek lub zdecydujesz się rozszerzyć komentarze o inne metadane, to możliwe, że przełamiesz tę barierę. Pobieranie dużego dokumentu jest również kosztowne i czasochłonne.

Ogólnie dokumenty osadzone są świetne, jeśli nie są niezwiązanymi tablicami. Lista dziesięciu najlepszych komentarzy będzie działać dobrze, ale zachowanie ponad 1000 komentarzy jest złe.

Istnieją pewne dobra prezentacja pod

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

Myślę, że jest więcej pracy wkrótce po projektowaniu schematu, który będzie bardziej pomocne w dłuższej perspektywie. Myślę, że najtrudniej jest być szczerym. Wiem, trochę czasu zajęło mi owinięcie głowy wokół różnic między modelami relacyjnymi.

+0

komentarze nie są długimi tekstami i dużą ilością, więc 16 MB na dokument jest wystarczające. i naprawdę martwię się o elastyczność i wydajność. tak naprawdę jest to zły sposób na przechowywanie komentarzy (lub innych niezwiązanych tablic) jako dokumentu osadzonego, prawda? – Kevin

+0

Cóż, niektóre rodzaje zapytań są bardzo trudne do wykonania z dokumentami osadzonymi, np. Podaj mi wszystkie komentarze danego użytkownika. Zasadniczo jest to dobry przypadek dla denormalizacji. – christkv

+0

Zgadzam się. Ale myślę też, że wbudowany lub nie zależy od tego, czego potrzebuje aplikacja, jeśli nie potrzebuję komentarzy zapytań przez inne pola, ale tylko przez artykuł (innymi słowy, komentarze zawsze pojawiają się z artykułem), wolę osadzić tablicę komentarzy w dokumencie artykułu. – Kevin