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

Analog til gruppeconcat i sql

Ifølge kommentarer indtil videre er det uklart, hvad du grupperer, eller hvad du vil have som slutresultat, bortset fra at sige, at du ønsker at få dine datoer sammenkædet til noget som "bare dagen" uden timer eller minutter sammen. Formodentlig vil du have disse særskilte dage til et eller andet formål.

Der er forskellige datooperatører i pipeline, du kan bruge på datoer, og det er $concat også operatør. Desværre alle datooperatørerne producere et heltal som deres resultat, og for den slags datostreng, du ønsker, $concat vil kun fungere med strenge. Det andet problem er, at du ikke kan caste heltal til en strengtype inden for aggregering.

Men du kan brug underdokumenter, her arbejder vi bare med datoen:

db.record.aggregate([
    // Unwind the array to work with it
    {$unwind: "$date"},

    // project into our new 'day' document
    {$project:{ 
        day: { 
            year: {$year: "$date"},
            month: {$month: "$date"}, 
            day: {$dayOfMonth: "$date"}
        }
     } },

     // optionalally sort if date order is important [ oldest -> newest ] 
     {$sort: { "day.year": -1, "day.month": -1, "day.day": -1}},

     // Wind back unique values into the array
     {$group: {_id:"$_id", days: {$addToSet: "$day"} }}
])

Så det er ikke en streng, men den kan nemt efterbehandles til én, men vigtigst af alt er den grupperet og sorterbar.

Principperne forbliver de samme, hvis du ønsker de unikke dates på denne måde som en matrix i slutningen, eller om du vil gruppere totaler efter disse datoer. Så husk først og fremmest $unwind og $project delene ved hjælp af datooperatorerne.

--REDIGER--

Med tak til fællesskabet som vist i dette indlæg der er denne udokumenterede adfærd hos $substr , hvori heltal kan støbes som strenge.

db.record.aggregate([
    // Unwind the array to work with it
    {$unwind: "$date"},

    // project into our new 'day' document
    {$project:{ 
        day: { 
            year: {$year: "$date"},
            month: {$month: "$date"}, 
            day: {$dayOfMonth: "$date"}
        }
     } },

     // optionalally sort if date order is important [ oldest -> newest ] 
     {$sort: { "day.year": -1, "day.month": -1, "day.day": -1}},

     // now we are going to project to a string ** magic @heinob **
     {$project: { 
         day: {$concat: [
             {$substr: [ "$day.year", 0, 4 ]},
             "-",
             {$substr: [ "$day.month", 0, 2 ]},
             "-",
             {$substr: [ "$day.day", 0, 2 ]}
         ]}
     }},

     // Wind back unique values into the array
     {$group: {_id:"$_id", days: {$addToSet: "$day"} }}
])

Og nu days er strenge. Som jeg bemærkede før, hvis rækkefølgen er vigtig for dig, så er den bedste tilgang at projicere ind i en dokumenttype, som det er blevet gjort, og sortere på de numeriske taster. Naturligvis kan $projektet, der transformerer datoen, vikles ind i $gruppestadiet for kortheds skyld, hvilket sandsynligvis er det, du vil gøre, når du arbejder med hele dokumentet.



  1. Hadoop MapReduce jobudførelse flowdiagram

  2. Indsæt array af objekter i MongoDB

  3. MongoDB-områdeforespørgsel på hele den indlejrede dokumentværdi

  4. Gruppe (efter) i Mongoose?