Tôi không chắc tại sao bạn nghĩ rằng bạn cần giá trị tính bằng giây thay vì mili giây vì nói chung cả hai biểu mẫu đều hợp lệ và trong hầu hết các triển khai ngôn ngữ, mili giây thực sự được ưu tiên hơn. Nhưng nói chung, cố gắng ép buộc điều này thành một chuỗi là một cách sai lầm để giải quyết vấn đề này và nói chung bạn chỉ làm phép toán:
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
]}
]
}
}}
])
Nó trả về cho bạn một dấu thời gian của kỷ nguyên trong vài giây. Về cơ bản bắt nguồn từ khi một đối tượng ngày BSON được trừ cho một đối tượng khác thì kết quả là khoảng thời gian tính bằng mili giây. Sử dụng ngày kỷ nguyên đầu tiên là "1970-01-01" về cơ bản trích xuất giá trị mili giây từ giá trị ngày hiện tại. $divide
về cơ bản toán tử loại bỏ phần mili giây và $mod
modulo để triển khai làm tròn.
Thực sự, mặc dù bạn nên thực hiện công việc bằng ngôn ngữ mẹ đẻ cho ứng dụng của mình vì tất cả các ngày của BSON sẽ được trả về ở đó dưới dạng loại "ngày / giờ" bản địa, nơi bạn có thể trích xuất giá trị dấu thời gian. Xem xét các kiến thức cơ bản về JavaScript trong shell:
var date = new Date()
( date.valueOf() / 1000 ) - ( ( date.valueOf() / 1000 ) % 1 )
Thông thường với tính năng tổng hợp, bạn muốn thực hiện loại "toán học" này đối với giá trị dấu thời gian để sử dụng cho mục đích gì đó như tổng hợp các giá trị trong một khoảng thời gian chẳng hạn như một ngày. Khung tổng hợp có sẵn các toán tử ngày, nhưng bạn cũng có thể thực hiện theo cách toán ngày:
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 }
}}
])
Dạng đó sẽ điển hình hơn nếu tạo ra một dấu thời gian được làm tròn đến một ngày và tổng hợp các kết quả trong khoảng thời gian đó.
Vì vậy, mục đích của bạn đối với khung tổng hợp chỉ để trích xuất một dấu thời gian có vẻ không phải là cách sử dụng tốt nhất hoặc thực sự không cần thiết phải chuyển nó thành giây thay vì mili giây. Trong đơn đăng ký của bạn, tôi nghĩ bạn nên làm điều đó trừ khi tất nhiên bạn thực sự muốn có kết quả trong khoảng thời gian mà bạn có thể áp dụng phép toán ngày như được hiển thị.
Các phương pháp đều có ở đó, nhưng trừ khi bạn thực sự tổng hợp thì đây sẽ là tùy chọn hiệu suất kém nhất cho ứng dụng của bạn. Thực hiện chuyển đổi bằng mã thay thế.