sql >> Database >  >> NoSQL >> MongoDB

Analoog voor groepsconcat in sql

Volgens de opmerkingen tot nu toe is het onduidelijk wat je groepeert of wat je als eindresultaat wilt, behalve om te zeggen dat je je datums wilt laten samenvoegen tot zoiets als "alleen de dag" zonder uren of minuten bij elkaar. Vermoedelijk wil je die verschillende dagen voor een bepaald doel.

Er zijn verschillende Date Operators in de pijplijn die je kunt gebruiken op datums, en het is de $concat exploitant ook. Helaas zijn alle Date Operators produceer een geheel getal als resultaat, en voor het soort Datum-tekenreeks dat u wilt, $concat werkt alleen met strings. Het andere probleem is dat je niet kunt casten het gehele getal in een tekenreekstype binnen aggregatie.

Maar je kunt gebruik subdocumenten, hier werken we alleen met de datum:

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

Het is dus geen string, maar het kan gemakkelijk worden nabewerkt tot één string, maar het belangrijkste is dat het gegroepeerd en sorteerbaar is.

De principes blijven hetzelfde als je de unieke dates . wilt op deze manier als een array aan het einde of dat u totalen op die datums wilt groeperen. Houd dus vooral rekening met de delen $unwind en $project met behulp van de datumoperators.

--EDIT--

Met dank aan de community zoals getoond in dit bericht er is deze ongedocumenteerde gedrag van $substr , waarin gehele getallen als strings kunnen worden gegoten.

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

En nu de days zijn snaren. Zoals ik al eerder opmerkte, als de volgorde belangrijk voor je is, is de beste aanpak om in een documenttype te projecteren zoals is gedaan en te sorteren op de numerieke toetsen. Natuurlijk kan het $project dat de datum transformeert voor de beknoptheid in de $group-fase worden gewikkeld, wat waarschijnlijk is wat u wilt doen als u met het hele document werkt.



  1. Mirth verbinden met mongo db-connectiviteit

  2. mongodb 3.x-stuurprogramma Android-compatibiliteit

  3. mongodb groep en subgroep telt

  4. Automatische nieuwe pogingen