2013-04-24 31 views
13

Tôi mới đến Mongoid. Trong tệp mô hình của tôi, tôi đã tạo một trường có kiểu dữ liệu BigDecimal. Tôi muốn lưu trữ tem thời gian trong đó. Dưới đây là mô hình mà tôi đang sử dụng:Lưu trữ Tem thời gian theo số Mongoid

class Test 
    include Mongoid::Document 
    field :time_stamp, type: BigDecimal 
end 

Và dưới đây là đoạn code mà tôi đang sử dụng để tạo ra một tài liệu:

aTime = "Wed Apr 24 09:48:38 +0000 2013" 
timest = aTime.to_time.to_i 
Test.create({time_stamp: timest}) 

tôi thấy rằng time_stamp được lưu giữ như String trong các cơ sở dữ liệu. Ai có thể trực tiếp cho tôi để lưu dấu thời gian như số trong DB để tôi có thể thực hiện một số hoạt động trên đó. Cảm ơn trước.

+2

Để lưu dấu thời gian, bạn cần phải 'include Mongoid :: Timestamps' .. Thao tác này sẽ tạo: các trường created_at &: updated_at vào tài liệu của bạn. Không chắc chắn trường của bạn như thế nào ': time_stamp' được điền một cách kỳ diệu với một chuỗi thời gian. – brayne

+0

Đây có thể là một lỗi trong trình điều khiển MongoDB của Mongoid, Moped. Bạn có thể đăng dữ liệu mà bạn có thể xem bằng cách truy vấn trong vỏ mongo không? Nếu bạn thực sự chỉ muốn lưu dấu thời gian, bạn chỉ có thể đặt loại trường thành 'Thời gian' thay vì' BigDecimal'. – davogones

+0

@senthil, chỉ cố gắng sao chép và bật lên giá trị (time_stamp) được lưu trữ dưới dạng một số. mongoid (3.0.23) – ted

Trả lời

2

Theo this answer, các loại số được hỗ trợ bởi MongoDB là:

MongoDB stores data in a binary format called BSON which supports these numeric data types: 

int32 - 4 bytes (32-bit signed integer) 
int64 - 8 bytes (64-bit signed integer) 
double - 8 bytes (64-bit IEEE 754 floating point) 

cốt thép bằng cách tuyên bố này trong Mongoid documentation:

Types that are not supported as dynamic attributes since they cannot be cast are: 

BigDecimal 
Date 
DateTime 
Range 

Tôi không biết về những điều bạn muốn với trường, nhưng nếu bạn thực sự muốn nó được lưu trữ dưới dạng một số, bạn phải sử dụng một kiểu số khác được hỗ trợ bởi MongoDB (BSON), có thể là Float hoặc Integer.

+0

Điều này không liên quan vì 'trường: time_stamp, nhập: BigDecimal' không chỉ định loại trường được hỗ trợ, BigDecimal. Nó phải chuyển đổi nó thành một số nguyên trước khi lưu trữ trên MongoDB. – davogones

+1

Tôi nghĩ rằng ** đôi ** có ý nghĩa hơn ** int32 ** cho ** ** thập phân, nhưng chưa đủ cho ** số thập phân không được ** (vì vậy nó phải được lưu trữ như một thứ khác, như **chuỗi**). Nếu trường của bạn có thể được biểu diễn dưới dạng một MongoDB ** int32 ** hoặc MongoDB ** int64 **, thì hãy đặt nó thành một số ** Mongoid **, không phải là Mongoid ** BigDecimal **. – michelpm

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