Nie jestem pewien, dlaczego uważasz, że potrzebujesz wartości w sekundach, a nie w milisekundach, ponieważ ogólnie obie formy są prawidłowe, a w większości implementacji językowych preferowane są milisekundy. Ale ogólnie rzecz biorąc, próba przekształcenia tego w ciąg znaków jest złym sposobem na obejście tego i zazwyczaj po prostu wykonujesz obliczenia:
db.data.aggregate([
{ "$project": {
"timestamp": {
"$subtract": [
{ "$divide": [
{ "$subtract": [ "$md", new Date("1970-01-01") ] },
1000
]},
{ "$mod": [
{ "$divide": [
{ "$subtract": [ "$md", new Date("1970-01-01") ] },
1000
]},
1
]}
]
}
}}
])
Co w ciągu kilku sekund zwraca sygnaturę czasową epoki. Zasadniczo wywodzi się z tego, że jeden obiekt daty BSON jest odejmowany od innego, a wynikiem jest przedział czasu w milisekundach. Użycie początkowej daty epoki „1970-01-01” powoduje zasadniczo wyodrębnienie wartości milisekund z bieżącej wartości daty. $divide
operator zasadniczo usuwa część milisekundową i $mod
czy modulo implementuje zaokrąglanie.
Naprawdę lepiej, jeśli wykonasz pracę w języku ojczystym swojej aplikacji, ponieważ wszystkie daty BSON zostaną tam zwrócone jako natywny typ „data/data/godzina”, w którym możesz wyodrębnić wartość znacznika czasu. Rozważ podstawy JavaScript w powłoce:
var date = new Date()
( date.valueOf() / 1000 ) - ( ( date.valueOf() / 1000 ) % 1 )
Zazwyczaj przy agregacji chcesz wykonać tego rodzaju „matematykę” na wartości sygnatury czasowej do użycia w czymś takim jak agregowanie wartości w przedziale czasowym, takim jak dzień. W ramach agregacji dostępne są operatory dat, ale można to również zrobić w sposób matematyczny dat:
db.data.aggregate([
{ "$group": {
"_id": {
"$subtract": [
{ "$subtract": [ "$md", new Date("1970-01-01") ] },
{ "$mod": [
{ "$subtract": [ "$md", new Date("1970-01-01") ] },
1000 * 60 * 60 * 24
]}
]
},
"count": { "$sum": 1 }
}}
])
Ta forma byłaby bardziej typowa, gdyby emitowała znacznik czasu zaokrąglony do dnia i agregowała wyniki w tych przedziałach.
Tak więc cel agregacji tylko w celu wyodrębnienia znacznika czasu nie wydaje się najlepszym zastosowaniem lub rzeczywiście nie powinno być konieczne przekonwertowanie tego na sekundy, a nie na milisekundy. Myślę, że powinieneś to robić w kodzie aplikacji, chyba że rzeczywiście chcesz uzyskać wyniki dla przedziałów czasu, w których możesz zastosować matematykę daty, jak pokazano.
Metody są dostępne, ale jeśli faktycznie nie agregujesz, będzie to najgorsza opcja wydajności dla Twojej aplikacji. Zamiast tego wykonaj konwersję w kodzie.