sql >> Databasteknik >  >> NoSQL >> MongoDB

sortering av mongoose underdokument

Jag skulle ha kunnat skriva ut det här som några saker, men med tanke på att "få tillbaka mangustföremålen" verkar vara huvudövervägandet.

Så det finns olika saker du "kunde" göra. Men eftersom du "fyller referenser" i ett objekt och sedan vill ändra ordningen på objekt i en array finns det verkligen bara ett sätt att fixa detta en gång för alla.

Åtgärda data i ordning när du skapar den

Om du vill att dina "kommentarer" ska sorteras efter det datum de skapades_på, delas detta till och med upp i flera möjligheter:

  1. Det "borde" ha lagts till i "insättningsordning", så det "senaste" är sist som du noterar, men du kan också "modifiera" detta under de senaste (de senaste åren nu) versioner av MongoDB med $position som en modifierare till $push :

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

    Detta "prependerar" arrayelementet till den befintliga arrayen vid det "första" (0) indexet så att det alltid är längst fram.

  2. Om du misslyckas med att använda "positionella" uppdateringar av logiska skäl eller bara där du "vill vara säker", så har $sort modifierare till $push :

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

    Och det kommer att "sortera" på egenskapen för arrayelementdokumenten som innehåller det angivna värdet på varje modifiering. Du kan till och med göra:

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

    Och det kommer att sortera varje "kommentar"-array i hela din samling efter det angivna fältet i en träff.

Andra lösningar är möjliga med antingen .aggregate() att sortera arrayen och/eller "casta om" till mongoose-objekt efter att du har gjort den operationen eller efter att ha gjort din egen .sort() på det vanliga föremålet.

Båda dessa involverar verkligen att skapa ett separat modellobjekt och "schema" med de inbäddade objekten inklusive den "refererade" informationen. Så du skulle kunna arbeta efter de linjerna, men det verkar vara onödigt överhead när du bara kan sortera data till dina "mest nödvändiga" medel i första hand.

Alternativet är att se till att fält som "virtuella" alltid "serialiseras" till ett objektformat med .toObject() jour och bara lev med att alla metoder är borta nu och arbeta med egenskaperna som de presenteras.

Det sista är ett "sanslöst" tillvägagångssätt, men om det du vanligtvis använder är "created_at"-ordningen, är det mycket mer meningsfullt att "lagra" dina data på det sättet med varje operation, så när du "hämtar" den stannar den i beställning som du ska använda.



  1. Mongodb grupp efter dbref fält

  2. Hur man anropar db.Collection.stats() från Mongo Java-drivrutin

  3. Kan meteor mongo förare hantera $each och $position operatorer?

  4. mongo - ruby ​​anslutningsproblem