Datentyp-Konvertierung in MongoDB
Habe ich eine Sammlung der sogenannten Dokument in MongoDB. Dokumente in dieser Sammlung haben ein Feld namens CreationDate gespeichert in ISO-date-Typ. Meine Aufgabe ist es, die Anzahl der erstellten Dokumente pro Tag und Sortieren Sie nach der Anzahl asynchron. Das Ausgabeformat ist erforderlich, um
[{_id:'yyyy-MM-dd', cnt:x}]. Ich habe versucht, die aggregation framework als unten.
db.Document.aggregate(
, {$project: {_id:1, Year:{$year:'$CreationDate'}, Month:{$month:'$CreationDate'}, Date:{$dayOfMonth:'$CreationDate'}}}
, {$group: {_id:{$concat:['$Year', '-', '$Month', '-', '$Date']}, cnt:{$sum:1}}}
, {$sort:{'cnt':-1}}
);
Den code gibt mir Fehler wie folgt:
$concat only supports strings, not NumberInt32
Ich verstehe, das ist, weil $Jahr, $Monat und $dayOfMonth ganze Zahl zurück. Es ist möglich, zu Komponieren, das _id Feld als ein Objekt und es neu zu formatieren in das gewünschte format in der Anwendung-Ebene.
Aber aus technischer Sicht, ich habe zwei Fragen:
-
Wie konvertiert eine Zahl zu einem string in MongoDB shell? In diesem Fall wird die Ausgabe von $Jahr kann dann in eine Zeichenfolge konvertiert werden und verwendet in $concat.
-
Gibt es eine bessere Art und Weise zu formatieren Isodatum Ausgabe verschiedener Datumsformate? In vielen Fällen brauchen wir nur einen bestimmten Teil einer Isodatum zum Beispiel: Datum-Komponente oder der Zeit Teil. Gibt es eine MongoDb eingebauten Operatoren um dies zu erreichen?
Vielen Dank im Voraus für jede Beratung.
- Gibt es einen Grund, Sie benötigen, um die Ausgabe zu formatieren komplett in MongoDB? Ich würde einfach schreiben, ein kleines Skript zu formatieren, einige string-Ausgabe auf der Grundlage der Unterlagen, die er erhält. Ansonsten, Sie sollten look into MapReduce.
- Philipp, ohne Grund! Ich versuche nur, zu erkunden. Trotzdem danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie dies mit
$concat
aber Sie müssen zuerst konvertieren zu einem string über$substr
, auch Umgang mit den zweistelligen Fall:Möglicherweise besser ist, benutzen Sie einfach das Datum der Mathematik statt, dies gibt einen epoch-timestamp-Wert, aber es ist einfach zu arbeiten, in ein date-Objekt, das im post-processing:
$substr
. Es ist ein wenig schrill, dass$concat
erwartet einen string, aber$substr
nicht... interessante Art und Weise zu "cast", obwohl.Ein weiterer einfacher Weg, können Sie konvertieren Isodatum, um verschiedene Datumsformate zu verwenden, die $dateToString aggregation operator.
Neil ' s Antwort sein Recht auf den Punkt, hat aber einen kleinen bug. In den Bedingungen (um zu überprüfen, ob die Zahl dem Monat und Tag muss vorangestellt werden mit 0) ist nicht
$gt
aber$lte
.Mit
$lte
, nur Monate und Tage, die mit einer Ziffer vorangestellt werden, die mit 0.e.g: 2014-10-03, 2014-08-03.
FÜR MONGO >= 3.0 (nach ~2015)
Bei einigen Armen Seelen stolpern über diese Frage im Jahr 2017, wie mich:
Wie der Mongo 3.0 gibt es jetzt ein dateToString Betreiber zur Verfügung
was bedeutet, dass wenn Sie korrekte Datum()'s Sie sollten in der Lage sein zu tun, einfach:
Für diejenigen von uns, die geschehen, um Termine gespeichert in nicht-Feld "Datum" (welche Freude!) Sie können erstellen Sie ein neues Date() Objekt in das Projekt Schritt.
In meinem Fall, wurde das Datum als Zahl gespeichert von Millisekunden (integer) und ich fügen Sie die Anzahl der Millisekunden an, die 0-Datum.
Konvertieren von Datum-format "xxxx-xx-xx"