2013-07-24 12 views
6

Trong MongoDB Shell trên cửa sổ nếu bạn chạy một truy vấn với một giá trị củaTại sao MongoDB shell mới ISODate (0001-01-01) trở về hẹn hò với 1901/01/01

new ISODate('0001-01-01T00:00:00Z') 

nó thực sự dường như để tìm kiếm

new ISODate('1901-01-01T00:00:00Z') 

Nếu bạn nhập "ISODate mới ('0001-01-01T00: 00: 00Z')" trực tiếp trong Mongo Shell bạn có thể thấy chuyển đổi này diễn ra như nó trả ISODate ("1901-01-01T00: 00: 00Z ").

Nhưng kỳ lạ, khi bạn sử dụng "Ngày mới" thay vì "ISODate mới" bằng cách nhập:

new Date('0001-01-01T:00:00:00Z') 

nó trả ISODate ("0001-01-01T00: 00: 00Z") đó là chính xác.

Cả hai đều phải trả lại ISOD theo the docs và theo ý tôi, tôi sẽ hành động giống nhau. Có ai biết tại sao họ không và cho dù đó là một lỗi hoặc một tính năng?

Trả lời

5

Bên trong, new ISODate thực sự có nghĩa là:

Date.UTC(year, month, date, hour, min, sec, ms); 

IE, MongoDB chia tách lên chuỗi thành các nguyên tố với một biểu thức chính quy (Tuyến 60 tại https://github.com/mongodb/mongo/blob/master/src/mongo/shell/types.js#L56)

JavaScript ngày đối tượng có một vài initialisers khác nhau (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#Syntax). Nếu bạn sử dụng:

new Date("0001-01-01T:00:00:00"); 

Sau đó, năm bốn chữ số 0001 không phân tích hay giải thích, nhưng khi bạn sử dụng nó như MongoDB làm:

Date.UTC(parseInt("0001")) 

quy tắc Sau đó, đặc biệt áp dụng cho những năm 00-99 áp dụng . Tài liệu tại số https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#Date_instances gợi ý một chút về điều này.

Có một vé máy chủ MongoDB đã có tại https://jira.mongodb.org/browse/SERVER-8164, vui lòng bỏ phiếu cho nó.

+0

Cảm ơn - đã hoàn tất. –