MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

MongoDB $dateFromString

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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Wyjaśnienie SQL NULLIF()

  2. Kiedy używać CouchDB przez MongoDB i na odwrót?

  3. mangusta/mongodb sortowanie niestandardowe

  4. MongoDB WYBIERZ LICZENIE GRUPY WG

  5. Jak wybrać jedno pole dla wszystkich dokumentów w kolekcji MongoDB?