Не съм сигурен защо смятате, че се нуждаете от стойността в секунди, а не в милисекунди, тъй като обикновено и двете форми са валидни и в повечето езикови реализации милисекундите всъщност са предпочитани. Но най-общо казано, да се опитвате да принудите това в низ е грешен начин да заобиколите това и обикновено просто правите математиката:
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
]}
]
}
}}
])
Което ви връща времева марка за епоха в секунди. По принцип се получава от това, когато един обект за дата на BSON се изважда от друг, тогава резултатът е интервалът от време в милисекунди. Използването на началната дата за епоха "1970-01-01" води до извличане по същество на стойността на милисекунди от стойността на текущата дата. $divide
Операторът по същество премахва частта от милисекунди и $mod
изпълнява модула за прилагане на закръгляване.
Наистина е по-добре да вършите работата на родния език за вашето приложение, тъй като всички дати на BSON ще бъдат върнати там като роден тип „дата/дата и час“, където можете да извлечете стойността на клеймото за време. Помислете за основите на JavaScript в обвивката:
var date = new Date()
( date.valueOf() / 1000 ) - ( ( date.valueOf() / 1000 ) % 1 )
Обикновено с агрегирането искате да направите този вид "математика" на стойност на времеви клей, за използване в нещо като агрегиране на стойности в рамките на период от време, като например ден. Има оператори за дата, достъпни за рамката за агрегиране, но можете да го направите и по математическия начин за дата:
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 }
}}
])
Тази форма би била по-типична за излъчване на времева марка, закръглена до ден, и обобщаване на резултатите в рамките на тези интервали.
Така че вашето предназначение на рамката за агрегиране само за извличане на времева марка не изглежда най-доброто използване или наистина не трябва да е необходимо да го преобразувате в секунди, а не в милисекунди. В кода на приложението ви е мястото, където според мен трябва да правите това, освен ако, разбира се, всъщност не искате резултати за интервали от време, през които можете да приложите изчисленията на датата, както е показано.
Методите са налице, но освен ако всъщност не агрегирате, това би било най-лошата опция за производителност за вашето приложение. Вместо това направете преобразуването в код.