2012-12-19 6 views
54

Pracuję nad moim pierwszym projektem wykorzystującym Meteor i mam pewne problemy z sortowaniem.Jak mogę posortować kolekcję Meteoryt w chwili wstawienia?

Mam formularz, w którym użytkownicy wpisują aforyzmy, które są następnie wyświetlane na liście. Obecnie najnowsze aforyzmy wyświetlają się automatycznie na dole listy. Czy istnieje prosty sposób, aby zamiast tego pojawiły się najnowsze u góry listy?

Próbowałem:

Template.list.aphorisms = function() { 
    return Aphorisms.find({}, {sort: {$natural:1}}); 
}; 

i jestem zakłopotany, ponieważ docs Meteor nie mają wiele przykładów.

+0

Zawsze możesz dodać atrybut "date_created" i sortować według tego. – knownasilya

+0

Jak wygląda twoja kolekcja? – muruga

+0

Dodałem atrybut date_created ... Miałem nadzieję na MongoDB, że nie musiałbym tego robić, chociaż ... – squeezemylime

Odpowiedz

99

Zakładając, że date_created jest w ważnym formacie daty wraz ze znacznikiem czasu, należy włożyć przetworzoną wartość date_created korzystając Date.parse() javascript funkcji, co daje liczbę milisekund między 1 stycznia 1970 a wartość daty zawartej w date_created.

W wyniku tego ostatnio dodany rekord będzie zawierał większą wartość date_created niż rekord wstawiony przed nim.

Teraz podczas pobierania rekordów, sortowania kursor w porządku malejącym parametru date_created jak:

Aphorisms.find({}, {sort: {date_created: -1}}); 

To będzie sortować rekordy z nowszej na starsza.

Mam nadzieję, że to pomoże.

+0

Działa to bardzo dobrze. Jedyny sposób, w jaki obecnie mogę przechowywać datę w sposób, który działa: var combinedTime = year + "" + day + "" + miesiąc + "" + godzina + "" + minuta + "" + sekunda; – squeezemylime

+0

Tak, upewnij się, że atrybut 'date_created' zawiera również prawidłową sygnaturę czasową. Ponieważ nie zadziała tylko z "datą + miesiąc + rok". –

+1

Aby sortować daty po stronie klienta w minimongo, data musi być przechowywana jako ciąg znaków, na przykład w formacie ISO8601. Minimongo nie wie, jak sortować według typów dat. Zobacz tekst w kolorze czerwonym pod http://docs.meteor.com/#collections –

8

Znalazłem następujące być czystsze rozwiązanie:

Template.list.aphorisms = function() { 
     return Aphorisms.find().fetch().reverse(); 
    }; 

Biorąc pod uwagę, że cała kolekcja już istnieje w odwrotnej kolejności, że chcesz, możesz po prostu utworzyć tablicę wszystkich obiektów i rewers kolejność.

+3

Nie jestem pewien, czy możesz polegać na Mongo, utrzymując twoje przedmioty w porządku. Teoretycznie tak, to działa - ale według mojej najlepszej wiedzy nie zawsze jest to bezpieczne założenie. – j6m8

+2

To jest najbezpieczniejsze rozwiązanie. MongoDB automatycznie tworzy pole createdAt w Meteor. Tak więc przy dużych zapytaniach jest to najbezpieczniejsze i najczystsze rozwiązanie. – TheBetterJORT

+2

Cześć, pole 'createdAt' nie zostało utworzone automatycznie (być może było to w chwili komentowania, ja używam wersji 1.4.2).Trzeba sobie z tym poradzić samemu, zwykle dzięki pakietowi 'aldeed: collection2'. Nie jestem pewien, dlaczego nie jest to zachowanie domyślne, jak w przypadku mangusty lub innych języków. –

Powiązane problemy