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

Analogico per gruppo concat in sql

Per quanto riguarda i commenti finora, non è chiaro cosa stai raggruppando o cosa vuoi come risultato finale, a parte il dire che vuoi concatenare le tue date in qualcosa come "solo il giorno" senza ore o minuti insieme. Presumibilmente vuoi quei giorni distinti per qualche scopo.

Esistono vari Operatori di data in cantiere puoi usare le date, ed è il $concat anche operatore. Sfortunatamente tutti gli Operatori di data produrre un numero intero come risultato e per il tipo di stringa di data che desideri, $concat funzionerà solo con le stringhe. L'altro problema è che non puoi trasmettere il numero intero in un tipo stringa all'interno dell'aggregazione.

Ma tu puoi usa i documenti secondari, qui lavoreremo solo con la data:

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

Quindi, non è una stringa, ma può essere facilmente postelaborata in una, ma soprattutto è raggruppata e ordinabile.

I principi rimangono gli stessi se vuoi le dates univoche in questo modo come una matrice alla fine o se si desidera raggruppare i totali in base a quelle date. Quindi tieni principalmente a mente le parti $unwind e $project usando gli operatori di data.

--MODIFICA--

Grazie alla community, come mostrato in questo post c'è questo non documentato comportamento di $substr , in cui è possibile eseguire il cast di interi come stringhe.

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

E ora i days sono stringhe. Come ho notato prima, se l'ordinamento è importante per te, l'approccio migliore è proiettare in un tipo di documento come è stato fatto e ordinare i tasti numerici. Naturalmente il $progetto che trasforma la data può essere avvolto nella fase di $gruppo per brevità, che è probabilmente ciò che si vuole fare quando si lavora con l'intero documento.