MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

сортиране на поддокумент на mongoose

Можех да напиша това като няколко неща, но при обмислянето „връщането на обектите на мангуста“ изглежда е основното съображение.

Така че има различни неща, които "можете" да направите. Но тъй като "попълвате препратки" в обект и след това искате да промените реда на обектите в масив, наистина има само един начин да поправите това веднъж завинаги.

Коригирайте данните в реда, в който ги създавате

Ако искате масивът ви „коментари“ да бъде сортиран по датата, на която са „created_at“, това дори се разделя на множество възможности:

  1. „Трябваше“ да е добавено в реда на „вмъкване“, така че „най-новото“ е последното, както отбелязвате, но можете също да „промените“ това в последните (от последните няколко години) версии на MongoDB с $position като модификатор на $push :

    Article.update(
        { "_id": articleId },
        { 
            "$push": { "comments": { "$each": [newComment], "$position": 0 } }
        },
        function(err,result) {
            // other work in here
        }
    );
    

    Това "предварява" елемента на масива към съществуващия масив в "първия" (0) индекс, така че винаги да е отпред.

  2. Неуспешно използване на „позиционни“ актуализации по логични причини или просто там, където „искате да сте сигурни“, тогава съществува от още „по-дълго“ време $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", тогава има много по-смислено да "съхранявате" данните си по този начин с всяка операция, така че когато ги "извлечете", те остават в поръчка, която ще използвате.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Не може да импортира json в MongoDB

  2. Върнете действителния тип на поле в MongoDB

  3. Относно MongoDB, защо го използваме? Терминологията и внедряването на MongoDB

  4. MongoDB:Сортиране на данни при използване на DBcollection find

  5. В Mongoose Model.find() и Model.find().exec() дават същия резултат. Така че защо да си правите труда да използвате Model.find().exec()?