Mogłem to opisać jako kilka rzeczy, ale biorąc pod uwagę „odzyskanie obiektów z mangusty” wydaje się, że jest to główna uwaga.
Są więc różne rzeczy, które „możesz” zrobić. Ale ponieważ „wypełniasz referencje” w Object, a następnie chcesz zmienić kolejność obiektów w tablicy, tak naprawdę jest tylko jeden sposób, aby to naprawić raz na zawsze.
Popraw dane w kolejności podczas ich tworzenia
Jeśli chcesz, aby twoja tablica "komentarze" była posortowana według daty ich utworzenia "w" to nawet dzieli się na wiele możliwości:
-
To „powinno” zostać dodane w kolejności „wstawiania”, więc „najnowsze” jest ostatnie, jak zauważyłeś, ale możesz również „zmodyfikować” to w ostatnich (od kilku lat) wersjach MongoDB za pomocą
$position
jako modyfikator$push
:Article.update( { "_id": articleId }, { "$push": { "comments": { "$each": [newComment], "$position": 0 } } }, function(err,result) { // other work in here } );
To "dokleja" element tablicy do istniejącej tablicy w "pierwszym" indeksie (0), więc zawsze znajduje się na początku.
-
Niepowodzenie przy użyciu aktualizacji „pozycyjnych” z powodów logicznych lub po prostu „chcesz mieć pewność”, oznacza to, że istnieje jeszcze „dłuższy” czas
$sort
modyfikator do$push
:Article.update( { "_id": articleId }, { "$push": { "comments": { "$each": [newComment], "$sort": { "$created_at": -1 } } } }, function(err,result) { // other work in here } );
I to będzie "sortować" według właściwości dokumentów elementów tablicy, które zawierają określoną wartość przy każdej modyfikacji. Możesz nawet zrobić:
Article.update( { }, { "$push": { "comments": { "$each": [], "$sort": { "$created_at": -1 } } } }, { "multi": true }, function(err,result) { // other work in here } );
A to posortuje każdą tablicę „komentarze” w całej kolekcji według określonego pola w jednym trafieniu.
Inne rozwiązania są możliwe przy użyciu .aggregate()
aby posortować tablicę i/lub "przerzucić" na obiekty typu mangusta po wykonaniu tej operacji lub po wykonaniu własnego .sort()
na zwykłym obiekcie.
Obie te rzeczy w rzeczywistości obejmują utworzenie oddzielnego obiektu modelu i „schematu” z osadzonymi elementami, w tym informacjami „odwołanymi”. Możesz więc pracować nad tymi liniami, ale wydaje się to być niepotrzebne, gdy możesz po prostu posortować dane według "najbardziej potrzebnych" środków.
Alternatywą jest upewnienie się, że pola takie jak „wirtualne” zawsze „serializują” do formatu obiektu za pomocą .toObject()
na telefon i po prostu żyj z faktem, że wszystkie metody zniknęły i działają z przedstawionymi właściwościami.
To ostatnie jest „rozsądnym” podejściem, ale jeśli zwykle używasz zamówienia „utworzono_w”, o wiele bardziej sensowne jest „przechowywanie” danych w ten sposób przy każdej operacji, więc gdy je „odzyskasz”, pozostają one w zamówienie, którego zamierzasz użyć.