MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Analog für Gruppenkonkat in SQL

Gemäß den bisherigen Kommentaren ist unklar, was Sie gruppieren oder was Sie als Endergebnis wünschen, außer zu sagen, dass Sie Ihre Daten zu etwas wie „nur den Tag“ ohne Stunden oder Minuten zusammenfügen möchten. Vermutlich wollen Sie diese besonderen Tage aus irgendeinem Grund.

Es gibt verschiedene Datumsoperatoren in der Pipeline können Sie Daten verwenden, und das ist der $concat Betreiber ebenso. Leider alle Datumsoperatoren erzeugen als Ergebnis eine ganze Zahl und für die gewünschte Datumszeichenfolge $concat funktioniert nur mit Strings. Das andere Problem ist, dass Sie nicht casten können die ganze Zahl in einen String-Typ innerhalb der Aggregation.

Aber Sie können Unterdokumente verwenden, hier arbeiten wir nur mit dem 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"} }}
])

Es ist also keine Zeichenfolge, aber es kann leicht zu einer nachbearbeitet werden, aber vor allem ist es gruppiert und sortierbar.

Die Prinzipien bleiben gleich, wenn Sie die eindeutigen dates wünschen auf diese Weise als Array am Ende oder ob Sie Summen nach diesen Daten gruppieren möchten. Denken Sie also in erster Linie an die $unwind- und $project-Teile, die die Datumsoperatoren verwenden.

--BEARBEITEN--

Mit Dank an die Community, wie in diesem Beitrag gezeigt da ist das undokumentiert Verhalten von $substr , in dem Integer in Strings umgewandelt werden können.

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

Und jetzt die days sind Saiten. Wie ich bereits erwähnt habe, ist es am besten, wenn die Reihenfolge für Sie wichtig ist, wie bisher in einen Dokumenttyp zu projizieren und anhand der Zifferntasten zu sortieren. Natürlich kann das $project, das das Datum umwandelt, der Kürze halber in die $group-Phase gewickelt werden, was wahrscheinlich das ist, was Sie tun möchten, wenn Sie mit dem gesamten Dokument arbeiten.