Можех да напиша това като няколко неща, но при обмислянето „връщането на обектите на мангуста“ изглежда е основното съображение.
Така че има различни неща, които "можете" да направите. Но тъй като "попълвате препратки" в обект и след това искате да промените реда на обектите в масив, наистина има само един начин да поправите това веднъж завинаги.
Коригирайте данните в реда, в който ги създавате
Ако искате масивът ви „коментари“ да бъде сортиран по датата, на която са „created_at“, това дори се разделя на множество възможности:
-
„Трябваше“ да е добавено в реда на „вмъкване“, така че „най-новото“ е последното, както отбелязвате, но можете също да „промените“ това в последните (от последните няколко години) версии на MongoDB с
$position
като модификатор на$push
:Article.update( { "_id": articleId }, { "$push": { "comments": { "$each": [newComment], "$position": 0 } } }, function(err,result) { // other work in here } );
Това "предварява" елемента на масива към съществуващия масив в "първия" (0) индекс, така че винаги да е отпред.
-
Неуспешно използване на „позиционни“ актуализации по логични причини или просто там, където „искате да сте сигурни“, тогава съществува от още „по-дълго“ време
$sort
модификатор на$push
:Article.update( { "_id": articleId }, { "$push": { "comments": { "$each": [newComment], "$sort": { "$created_at": -1 } } } }, function(err,result) { // other work in here } );
И това ще "сортира" по свойството на елементите на масива документи, които съдържат определената стойност при всяка модификация. Можете дори да направите:
Article.update( { }, { "$push": { "comments": { "$each": [], "$sort": { "$created_at": -1 } } } }, { "multi": true }, function(err,result) { // other work in here } );
И това ще сортира всеки масив „коментари“ в цялата ви колекция по определеното поле с едно посещение.
Други решения са възможни с помощта на .aggregate()
за сортиране на масива и/или „прекастиране“ към обекти на mongoose, след като сте извършили тази операция или след като направите свой собствен .sort()
върху обикновения обект.
И двете наистина включват създаване на отделен моделен обект и "схема" с вградените елементи, включително "реферираната" информация. Така че бихте могли да работите върху тези редове, но изглежда ненужно излишно, когато можете просто да сортирате данните за вас „най-необходими“ означава на първо място.
Алтернативата е да се уверите, че полета като "virtuals" винаги се "сериализират" в обектен формат с .toObject()
на повикване и просто живейте с факта, че всички методи вече са изчезнали и работите с представените свойства.
Последният е "разумен" подход, но ако това, което обикновено използвате, е редът "created_at", тогава има много по-смислено да "съхранявате" данните си по този начин с всяка операция, така че когато ги "извлечете", те остават в поръчка, която ще използвате.