sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur man aggregerar med grupp efter och sorterar korrekt

Det finns några hakar här att förstå.

När du använder $group gränserna kommer att sorteras i den ordning som de upptäcktes utan vare sig ett initialt eller slutsteg $sort drift. Så om dina dokument ursprungligen var i en sådan ordning:

{ uid: 1, created: ISODate("2014-05-02..."), another_col : "x" },
{ uid: 1, created: ISODate("2014-05-05..."), another_col : "y" },
{ uid: 3, created: ISODate("2014-05-05..."), another_col : "w" },
{ uid: 2, created: ISODate("2014-05-10..."), another_col : "z" },

Sedan är det bara att använda $group utan en $sort i slutet av pipelinen skulle ge dig resultat så här:

{ uid: 1, created: ISODate("2014-05-05..."), another_col : "y" },
{ uid: 3, created: ISODate("2014-05-05..."), another_col : "w" },
{ uid: 2, created: ISODate("2014-05-10..."), another_col : "z" },

Det är ett koncept, men det verkar faktiskt som att det du förväntar dig i resultat kräver att du returnerar de "sista andra fälten" i en sorterad ordning av uid är vad du letar efter. I så fall är sättet att få ditt resultat faktiskt att $sort först och använd sedan $last operatör:

db.mycollection.aggregate([

    // Sorts everything first by _id and created
    { "$sort": { "_id": 1, "created": 1 } },

    // Group with the $last results from each boundary
    { "$group": {
        "_id": "$uid",
        "created": { "$last": "$created" },
        "another_col": { "$last": "$created" }
    }}
])

Eller i princip tillämpa sorteringen på vad du vill ha.

Skillnaden mellan $last och $max är att den senare kommer att välja det "högsta" värdet för det givna fältet inom grupperingen _id , oavsett strömmen sorterad i osorterad ordning. Å andra sidan, $last kommer att välja värdet som förekommer i samma "rad" som den "sista" grupperingen _id värde.

Om du faktiskt letade efter att sortera värdena för en array så är tillvägagångssättet liknande. Om du håller arraymedlemmarna i "skapad" ordning skulle du också sortera först:

db.mycollection.aggregate([

    // Sorts everything first by _id and created
    { "$sort": { "_id": 1, "created": 1 } },

    // Group with the $last results from each boundary
    { "$group": {
        "_id": "$uid",
        "row": {
            "$push": {
                "created": "$created",
                "another_col": "$another_col"
            }
        }
    }}
])

Och dokumenten med dessa fält kommer att läggas till i arrayen i den ordning de redan sorterades efter.



  1. Hur använder man flera mongodb-databaser i vårstartapplikationen?

  2. Är det möjligt att byta namn på fält i utdata från en Mongo-fråga i PyMongo?

  3. MongoDB-skalets kommandoradsautentisering misslyckas

  4. MongoDB java-drivrutin:filtrera efter id