sql >> Databasteknik >  >> NoSQL >> MongoDB

Analog för group concat i sql

Enligt kommentarer hittills är det oklart vad du grupperar eller vad du vill ha som slutresultat, annat än att säga att du vill få dina datum sammanlänkade till något som "bara dagen" utan timmar eller minuter tillsammans. Förmodligen vill du ha dessa distinkta dagar för något syfte.

Det finns olika datumoperatörer i pipelinen kan du använda på datum, och det är $concat operatör också. Tyvärr alla datumoperatörer producera ett heltal som resultatet, och för den typ av datumsträng du vill ha, $concat fungerar bara med strängar. Det andra problemet är att du inte kan casta heltal till en strängtyp inom aggregering.

Men du kan använd underdokument, här arbetar vi bara med datumet:

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 är inte en sträng, men den kan lätt efterbehandlas till en, men viktigast av allt är den grupperad och sorterbar.

Principerna förblir desamma om du vill ha de unika dates på detta sätt som en array i slutet eller om du vill gruppera summor efter dessa datum. Så tänk i första hand på delarna $unwind och $project med hjälp av datumoperatorerna.

--REDIGERA--

Med tack till communityn som visas i det här inlägget det finns detta odokumenterat beteende hos $substr , där heltal kan gjutas som strängar.

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"} }}
])

Och nu days är strängar. Som jag noterade tidigare, om beställningen är viktig för dig är det bästa tillvägagångssättet att projicera in i en dokumenttyp som har gjorts och sortera på de numeriska tangenterna. Naturligtvis kan $projektet som omvandlar datumet lindas in i $group-stadiet för korthetens skull, vilket förmodligen är vad du vill göra när du arbetar med hela dokumentet.



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

  2. MongoDB kapslad ELLER/OCH var?

  3. ansluter till atlas mongo-databasen

  4. API Connect visar felet Kan inte HÄMTA /apim/ vid uppdatering av schema