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

Hvordan man aggregerer med grupper efter og sorterer korrekt

Der er et par greb her at forstå.

Når du bruger $group grænserne vil blive sorteret i den rækkefølge, som de blev opdaget uden hverken en indledende eller afsluttende fase $sort operation. Så hvis dine dokumenter oprindeligt var i en rækkefølge som denne:

{ 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" },

Så skal du bare bruge $group uden en $sort i enden på pipelinen ville returnere resultater som dette:

{ 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 er ét koncept, men det ser faktisk ud til, at det, du forventer i resultater, kræver at returnere de "sidste andre felter" i en sorteret rækkefølge af uid er det du leder efter. I så fald er måden at få dit resultat faktisk ved at $sort først og derefter bruge $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 det væsentlige anvende sorteringen på det, du ønsker.

Forskellen mellem $last og $max er, at sidstnævnte vil vælge den "højeste" værdi for det givne felt inden for grupperingen _id , uanset den aktuelle sorteret i usorteret rækkefølge. På den anden side, $last vil vælge den værdi, der forekommer i den samme "række" som den "sidste" gruppering _id værdi.

Hvis du rent faktisk ledte efter at sortere værdierne af et array, så er tilgangen den samme. Hvis du holder array-medlemmerne i "oprettet" rækkefølge, vil du også sortere 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"
            }
        }
    }}
])

Og dokumenterne med disse felter vil blive tilføjet til arrayet i den rækkefølge, de allerede var sorteret efter.



  1. hvordan finder man et særskilt felt af en model på en og tilstand hos mangust?

  2. MongoDB count() udefineret

  3. Brug af Redis som mellemliggende cache til REST API

  4. Rescue :Forbindelse nægtet - Kan ikke oprette forbindelse til Redis på localhost:6379