Ich habe die folgende Frage:
%Vor%Das obige Abfrageergebnis lautet:
%Vor% Aber ich möchte seine Dauer in year
+ month
+ day
format bekommen, etwa so: 2 y, 3 m, 20 d
.
Ein weiterer Punkt, wenn ein Kurs läuft, ist das to
-Feld null und ein anderes Feld isGoingOn: true
, also sollte ich hier die Dauer berechnen, indem ich das aktuelle Datum anstelle von to
-Feld verwende.
Und Benutzer hat Array von natürlich Filialdokumenten
Ein anderer Punkt ist dies: Dieses Datum kann in einem Filialdokument zu dem anderen Filialdokument nicht kontinuierlich sein. Ein Benutzer kann einen Kurs für 1 Jahr haben, und dann nach 2 Jahren, er / sie begann seinen / ihren nächsten Kurs für 1 Jahr und 3 Monate (es bedeutet, dass dieser Benutzer insgesamt 2 Jahre und 3 Monate Kursdauer hat) .
Was ich will, ist, Datum Unterschied jedes Filialdokument in Ausbildungen Array zu bekommen, und summiere diese. Angenommen, in meinen Beispieldaten Java
Kursdauer ist 6 Monate und 22 Tage, PHP
Kursdauer ist 1 Jahr und 6 Monate und 22 Tage, und die letzte ist vom 8 Feb 2017 bis jetzt, und es wird auf, so ist meine Bildungsdauer die Summe dieser Intervalle.
Bitte versuchen Sie diese Aggregation, um einen Datumsunterschied in Tagen, Monaten und Jahren zu erhalten, fügen Sie multiple $addFields
stage compute hinzu und reduzieren Sie die Differenzen auf Datum, Monatsbereich ohne Unterlauf, und die Annahme ist hier 1 Monat = 30 Tage
Pipeline
%Vor%Ergebnis
%Vor%Nun, Sie könnten einfach einfach den vorhandenen Datumsaggregationsoperator verwenden, anstatt ihn zu verwenden mathe, um in "Tage" umzuwandeln, wie Sie jetzt haben:
%Vor%Es ist "irgendwie" eine Annäherung an die "Tage" und "Monate" ohne die notwendigen Operationen, um "sicher" von Schaltjahren zu sein, aber es würde Ihnen das Ergebnis bringen, das für die meisten Zwecke "nahe genug" sein sollte .
Sie können dies auch ohne $unwind
tun, solange Ihre MongoDB-Version dies ist 3.2 oder höher:
Dies liegt daran, dass Sie von MongoDB 3.4 aus $sum
direkt mit einem Array verwenden können oder einer Liste von Ausdrücken in Stufen wie $addFields
oder $project
und die $map
kann dieselben" date aggregation operator "-Ausdrücke für jedes Array-Element anwenden anstelle von $unwind
zuerst.
So kann die Hauptmathematik wirklich in einem Teil des "Reduzierens" des Arrays gemacht werden, und dann kann jede Summe durch die allgemeinen "Teiler" für die Jahre angepasst werden, und der "Modulo" oder "Rest" von irgendwelchen Überläufen in den Monaten und Tagen.
Im Wesentlichen zurück:
%Vor%Gegeben am 11. November 2017
Sie können Ihren Code vereinfachen, indem Sie die clientseitige Verarbeitung mit moment js
Bibliothek verwenden.
Die gesamte Datumszeit wird von Moment js library verarbeitet. Verwenden Sie duration
, um die verkürzte Zeit zu berechnen. diff
Verwenden Sie reduce, um die Zeitdifferenz über alle Array-Elemente hinzuzufügen, gefolgt von der Momentdauer, um die Zeit in Jahren / Monaten / Tagen auszugeben.
Es löst zwei Probleme:
Zum Beispiel:
%Vor%MongoDb-Integration:
%Vor%Tags und Links mongodb aggregation-framework mongoose