sql >> Database teknologi >  >> NoSQL >> MongoDB

mongoose underdokument sortering

Jeg kunne have skrevet dette ud som et par ting, men i betragtning af at "få mangustgenstandene tilbage" ser det ud til at være hovedovervejelsen.

Så der er forskellige ting, du "kunne" gøre. Men da du "udfylder referencer" i et objekt og derefter ønsker at ændre rækkefølgen af ​​objekter i et array, er der virkelig kun én måde at rette dette på én gang for alle.

Ret dataene i rækkefølge, mens du opretter dem

Hvis du vil have dine "kommentarer"-array sorteret efter den dato, de er "created_at", opdeles dette endda i flere muligheder:

  1. Det "burde" være tilføjet i "indsættelses" rækkefølge, så det "seneste" er sidst, som du bemærker, men du kan også "ændre" dette i de seneste (de seneste par år nu) versioner af MongoDB med $position som en modifikator til $push :

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

    Dette "forsætter" array-elementet til det eksisterende array ved det "første" (0) indeks, så det altid er foran.

  2. Hvis du ikke bruger "positionelle" opdateringer af logiske årsager eller bare hvor du "vil være sikker", så har der eksisteret i endnu "længere" tid $sort modifikator til $push :

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

    Og det vil "sortere" på egenskaben af ​​array-elementerne dokumenter, der indeholder den specificerede værdi på hver modifikation. Du kan endda gøre:

    Article.update(
        {  },
        { 
            "$push": { 
                "comments": { 
                    "$each": [], 
                    "$sort": { "$created_at": -1 } 
                }
            }
        },
        { "multi": true },
        function(err,result) {
            // other work in here
        }
    );
    

    Og det vil sortere hver "kommentar"-array i hele din samling efter det angivne felt i et enkelt hit.

Andre løsninger er mulige ved at bruge enten .aggregate() at sortere arrayet og/eller "re-caste" til mongoose-objekter, efter du har udført den handling eller efter at have udført din egen .sort() på den almindelige genstand.

Begge disse involverer virkelig at skabe et separat modelobjekt og "skema" med de indlejrede elementer inklusive de "refererede" oplysninger. Så du kunne arbejde på disse linjer, men det ser ud til at være unødvendigt overhead, når du bare kunne sortere dataene til dig "mest nødvendige" betyder i første omgang.

Alternativet er at sikre, at felter som "virtuelle" altid "serialiseres" til et objektformat med .toObject() vagt og lev bare med, at alle metoder er væk nu og arbejd med egenskaberne som præsenteret.

Den sidste er en "sans" tilgang, men hvis det, du typisk bruger, er "created_at"-rækkefølgen, så giver det meget mere mening at "lagre" dine data på den måde med hver operation, så når du "henter" dem, forbliver de i rækkefølge, som du skal bruge.



  1. Mongodb - Multiple tekstindeks:Indeksnøglemønster for stort fejlkode 67

  2. mongodb aggregat $lookup vs find og populate

  3. Sum i indlejret dokument MongoDB

  4. MongoDB MapReduce:Virker ikke som forventet for mere end 1000 poster