2015-01-12 10 views
8

Từ tài xế Java, tôi muốn lưu một tài liệu trông giống như dưới đây json trong MongoDBCách lưu giá trị kiểu Dấu thời gian trong MongoDb | Java

{ "ts" : Timestamp(1421006159, 4)} 

Tùy chọn Tôi cố gắng.

Tùy chọn 1: Bản đồ doc = new HashMap (1);

doc.put("ts", new BSONTimeStamp()); 

Nó là kết quả trong các định dạng dưới đây không cần

{"ts" : { 
     "_inc" : 0, 
     "_class" : "org.bson.types.BSONTimestamp" 
    }} 

Phương án 2:

doc.put("ts",new Timestamp(new Date().getTime())); 

nó kết quả trong:

{"ts" : ISODate("2015-01-12T05:36:43.343Z")} 

Trả lời

4

tôi đã sử dụng trí thông minh sau h trình điều khiển mongodb-java mặc định (không có dữ liệu mùa xuân).

DBObject doc= new BasicDBObject(); 
doc.put("ts", new BSONTimeStamp(1421006159, 4)); 

Và kết quả MongoDB cho một phát là:

{ "_id" : ObjectId("54b396da7fe45ee2d6c5e03a"), "ts" : Timestamp(1421006159, 4) } 

Vì vậy, các serialization của BSONTimeStamp đến classname và lớp thuộc tính một giá trị của họ phụ thuộc vào serializer lò xo dữ liệu MongoDB. Bạn nên sử dụng trình điều khiển java-mongodb mặc định hoặc sử dụng Java Date và Định dạng ISODate trong MongoDB.

Hoặc có thể bạn có thể mở rộng trình nối tiếp spring-data-mongodb và viết bộ nối tiếp và trình giải mã của riêng bạn cho Lớp BSONTimeStamp để sử dụng loại Dấu thời gian MongoDB.

+0

Bạn đang hoàn toàn đúng. Tôi đã thử tương tự như là tốt và nó hoạt động với đồng bằng mongodb-java-driver. Nhưng không phải với mùa xuân. Tôi cũng đã cố gắng với việc ghi đè mongoconverter để tránh khóa _class nhưng vẫn không hoạt động. Có thể là một lỗi trong mùa xuân. – hellojava

4

Từ MongoDB họ khuyên bạn nên lưu trữ một ngày kể từ BSON Timestamp là để sử dụng nội bộ:

http://docs.mongodb.org/manual/reference/bson-types/#timestamps

Sự khác biệt là ngày có nhiều đại diện hơn vì là một 64-bit số nguyên đại diện cho số mili giây kể từ thời đại Unix.

Trong BSON Dấu thời gian chỉ 32 bit có mục đích này; 32 bit khác là số nguyên thứ tự gia tăng trong vòng một giây để đảm bảo tính duy nhất của giá trị. Tôi cho rằng đây là lý do tại sao họ sử dụng Dấu thời gian trong oplog.

Nếu bạn không nhớ độc đáo Tôi khuyên bạn nên sử dụng một ngày (aka ISODate), do đó phương án 2 hoặc tùy chọn 3:

doc.put("ts", new Date()); 
+0

Đây có phải là từ Lib Mặc định của Java không? "new Date()"? –

Các vấn đề liên quan