Nie możesz używać operatorów agregacji dat
na czymkolwiek innym, co jest jednak Date
sam obiekt. Najlepszą opcją jest przekonwertowanie tych „ciągów” na prawidłowe Date
obiektów, dzięki czemu można poprawnie wykonywać zapytania w tej i przyszłych operacjach.
To powiedziawszy, jeśli twoje „ciągi” zawsze mają wspólną strukturę, można to zrobić za pomocą struktura agregacji
narzędzia. Wymaga to wielu manipulacji myślami, co nie czyni tego „optymalnym” podejściem do radzenia sobie z problemem. Ale przy ustalonej strukturze „podwójnych cyfr” i spójnym ograniczniku jest to możliwe dzięki $substr
operator:
db.collection.aggregate([
{ "$group": {
"_id": {
"year": { "$substr": [ "$dateStr", 7, 4 ] },
"month": { "$substr": [ "$dateStr", 4, 2 ] }
},
"count": { "$sum": 1 }
}}
])
Tak więc rzutowanie JavaScript nie działa w ramach agregacji. Zawsze możesz „przesyłać” dane wejściowe do potoku na podstawie oceny „kodu klienta”, ale sam proces agregacji nie ocenia żadnego kodu. Podobnie jak podstawowy silnik zapytań, wszystko to opiera się na implementacji „struktury danych”, która używa instrukcji „operatora natywnego” do wykonania pracy.
Nie można konwertować ciągów na daty w potoku agregacji. Powinieneś pracować z prawdziwą BSON Date
obiekty, ale możesz to zrobić za pomocą łańcuchów, jeśli istnieje spójny format, który można przedstawić w „kolejności leksykalnej”.
Nadal sugeruję przekonwertowanie ich na BSON Dates
JAK NAJSZYBCIEJ. I uważaj, że wartość „ISODate” lub UTC jest skonstruowana z inną postacią ciągu. tj.:
new Date("2020-01-07")
Będąc w formacie „rrrr-mm-dd”. Przynajmniej dla wywołania JavaScript.