W MongoDB $dateFromString
Operator potoku agregacji konwertuje ciąg daty/godziny na obiekt daty.
Przykład
Załóżmy, że mamy kolekcję o nazwie foo
z następującymi dokumentami:
{ "_id" : 1, "bar" : "2020-12-31T23:30:25.123" } { "_id" : 2, "bar" : "2020-12-31" } { "_id" : 3, "bar" : "2020-12-31T23:30" }
Wszystkie dokumenty zawierają ciąg daty/godziny.
Możemy uruchomić następujący kod, aby zwrócić obiekt daty z bar
pola w tych dokumentach.
db.foo.aggregate([
{
$project: {
date: {
$dateFromString: {
dateString: '$bar'
}
}
}
}
])
Wynik:
{ "_id" : 1, "date" : ISODate("2020-12-31T23:30:25.123Z") } { "_id" : 2, "date" : ISODate("2020-12-31T00:00:00Z") } { "_id" : 3, "date" : ISODate("2020-12-31T23:30:00Z") }
Wszystkie ciągi daty/czasu zostały przekonwertowane na obiekt daty.
Zmieniłem również nazwę pola z bar
do date
.
Określ format
Możesz podać opcjonalny format
argument, aby określić format dostarczanego ciągu daty/godziny. Specyfikacja formatu może być dowolnym literałem ciągu, zawierającym 0 lub więcej specyfikatorów formatu.
format
parametr jest dostępny od MongoDB w wersji 4.0.
Domyślny format to %Y-%m-%dT%H:%M:%S.%LZ
, czego używa poprzedni przykład.
Załóżmy, że wstawiamy do naszej kolekcji następujący dokument:
{ "_id" : 4, "bar" : "07/08/2020" }
W takim przypadku datą może być 7. dzień 8. miesiąca lub 8. dzień 7. miesiąca, w zależności od używanej lokalizacji.
Możemy użyć specyfikacji formatu, aby dokładnie określić, który powinien być.
Przykład:
db.foo.aggregate([
{ $match: { _id: 4 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
format: "%m/%d/%Y"
}
}
}
}
])
Wynik:
{ "_id" : 4, "date" : ISODate("2020-07-08T00:00:00Z") }
W tym przypadku określiliśmy, że jest to ósmy dzień siódmego miesiąca.
I znowu, ale tym razem zamieniamy dzień i miesiąc.
db.foo.aggregate([
{ $match: { _id: 4 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
format: "%d/%m/%Y"
}
}
}
}
])
Wynik:
{ "_id" : 4, "date" : ISODate("2020-08-07T00:00:00Z") }
Tym razem jest to interpretowane jako 7. dzień 8. miesiąca.
Zobacz MongoDB $dateFromString
Specyfikatory formatu dla listy prawidłowych specyfikatorów formatu.
Format daty tygodnia ISO
Istnieje kilka specyfikatorów formatu, które umożliwiają określenie dat przy użyciu formatu ISO 8601.
W szczególności możesz użyć:
Specyfikator formatu | Wyjście |
---|---|
%G | Rok w formacie ISO 8601 |
%u | Numer dnia tygodnia w formacie ISO 8601 (1-poniedziałek, 7-niedziela) |
%V | Tydzień roku w formacie ISO 8601 |
Załóżmy, że mamy dokument, który wygląda tak:
{ "_id" : 5, "bar" : "7-8-2020" }
Możemy zinterpretować tę datę jako siódmy dzień tygodnia ISO, po którym następuje ósmy tydzień ISO w roku, po którym następuje rok.
Tak:
db.foo.aggregate([
{ $match: { _id: 5 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
format: "%u-%V-%G"
}
}
}
}
])
Wynik:
{ "_id" : 5, "date" : ISODate("2020-02-23T00:00:00Z") }
Określ strefę czasową
Możesz określić strefę czasową do użycia z $dateFromString
operatora.
Strefę czasową można określić za pomocą identyfikatora strefy czasowej Olson (np. "Europe/London"
, "GMT"
) lub przesunięcie UTC (np. "+02:30"
, "-1030"
).
Identyfikator strefy czasowej Olsona
Oto przykład, który wyświetla ciąg daty w trzech różnych strefach czasowych, z których każda używa identyfikatorów strefy czasowej Olson:
db.foo.aggregate([
{ $match: { _id: 1 } },
{
$project: {
utc: {
$dateFromString: {
dateString: '$bar',
timezone: "UTC"
}
},
honolulu: {
$dateFromString: {
dateString: '$bar',
timezone: "Pacific/Honolulu"
}
},
auckland: {
$dateFromString: {
dateString: '$bar',
timezone: "Pacific/Auckland"
}
}
}
}
]).pretty()
Wynik:
{ "_id" : 1, "utc" : ISODate("2020-12-31T23:30:25.123Z"), "honolulu" : ISODate("2021-01-01T09:30:25.123Z"), "auckland" : ISODate("2020-12-31T10:30:25.123Z") }
Przesunięcie UTC
Oto przykład, który używa przesunięcia UTC.
db.foo.aggregate([
{ $match: { _id: 1 } },
{
$project: {
"date+00:00": {
$dateFromString: {
dateString: '$bar',
timezone: "+00:00"
}
},
"date-10:00": {
$dateFromString: {
dateString: '$bar',
timezone: "-10:00"
}
},
"date+12:00": {
$dateFromString: {
dateString: '$bar',
timezone: "+12:00"
}
}
}
}
]).pretty()
Wynik:
{ "_id" : 1, "date+00:00" : ISODate("2020-12-31T23:30:25.123Z"), "date-10:00" : ISODate("2021-01-01T09:30:25.123Z"), "date+12:00" : ISODate("2020-12-31T11:30:25.123Z") }
Jeśli używasz timezone
parametr, ciąg daty nie może być dołączony do litery Z, aby wskazać czas Zulu (strefa czasowa UTC). Na przykład ciąg daty nie może być następujący:2020-12-31T23:30:25.123Z
podczas korzystania z parametru strefy czasowej.
Nie dołączaj również informacji o strefie czasowej w ciągu daty, gdy używasz parametru strefy czasowej.
onNull
Parametr
onNull
Parametr może służyć do określenia, co zwrócić, jeśli data jest null lub nie istnieje.
Wartość dostarczona do onNull
parametr może być dowolnym poprawnym wyrażeniem.
Załóżmy, że mamy taki dokument:
{ "_id" : 6, "bar" : null }
Moglibyśmy użyć onNull
w następujący sposób:
db.foo.aggregate([
{ $match: { _id: 6 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
onNull: "No valid date was supplied"
}
}
}
}
])
Wynik:
{ "_id" : 6, "date" : "No valid date was supplied" }
W tym przypadku data była null
więc dokument wyjściowy zawiera ciąg, który podałem dla onNull
parametr.
onError
Parametr
Możesz opcjonalnie użyć onError
parametr zapewniający wyrażenie do wyjścia w przypadku wystąpienia błędu.
Załóżmy, że nasza kolekcja zawiera następujący dokument:
{ "_id" : 7, "bar" : "21st Dec, 2030" }
Nawet jeśli na bar
jest data pole, nie jest to prawidłowy ciąg daty/godziny i dlatego spowoduje błąd, jeśli użyjemy dateFromString
aby spróbować przekonwertować go na obiekt daty.
Przykład błędu:
db.foo.aggregate([
{ $match: { _id: 7 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar'
}
}
}
}
])
Wynik:
Error: command failed: { "ok" : 0, "errmsg" : "an incomplete date/time string has been found, with elements missing: \"21st Dec, 2030\"", "code" : 241, "codeName" : "ConversionFailure" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:618:17 [email protected]/mongo/shell/assert.js:708:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1046:12 @(shell):1:1
To paskudnie wyglądający błąd.
Możemy użyć onError
parametr, aby wyglądał ładniej:
db.foo.aggregate([
{ $match: { _id: 7 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
onError: "An error occurred while parsing the date string"
}
}
}
}
])
Wynik:
{ "_id" : 7, "date" : "An error occurred while parsing the date string" }
Widząc jako onNull
i onError
parametry pozwalają nam zwrócić rzeczywiste dokumenty, pozwalają nam zwrócić wiele dokumentów, bez obawy, że jeden zły dokument zatrzyma całą operację.
Przykład:
db.foo.aggregate([
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
onNull: "The date was either empty or null",
onError: "An error occurred while parsing the date string"
}
}
}
}
])
Wynik:
{ "_id" : 1, "date" : ISODate("2020-12-31T23:30:25.123Z") } { "_id" : 2, "date" : ISODate("2020-12-31T00:00:00Z") } { "_id" : 3, "date" : ISODate("2020-12-31T23:30:00Z") } { "_id" : 4, "date" : ISODate("2020-07-08T00:00:00Z") } { "_id" : 5, "date" : ISODate("2020-08-07T00:00:00Z") } { "_id" : 6, "date" : "The date was either empty or null" } { "_id" : 7, "date" : "An error occurred while parsing the date string" }