2013-04-24 14 views
13

Jestem nowy w Mongoid. W moim pliku modelu utworzyłem pole z typem danych BigDecimal. Chcę przechowywać w nim znacznik czasu. Poniżej jest model, który używam:Przechowywanie znacznika czasu jako numeru Mongoid

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

A poniżej jest kod, który używam do utworzenia dokumentu:

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

widzę, że datownik jest przechowywany jako ciąg w Baza danych. Czy ktoś może polecić mi przechowywać znacznik czasu jako numer w DB, aby mógł wykonać niektóre operacje na nim. Z góry dziękuję.

+2

Aby przechowywać znaczniki czasu, musisz "włączyć Mongoid :: Timestamps'. Spowoduje to utworzenie: created_at &: updated_at pól do twojego dokumentu. Nie wiem, w jaki sposób twoje pole ': time_stamp' jest magicznie wypełnione łańcuchem czasu. – brayne

+0

To może być błąd w MongoDB sterownika Mongoid, Moped. Czy możesz przesłać dane, które widzisz, wysyłając zapytania w powłoce Mongo? Jeśli naprawdę chcesz przechowywać znacznik czasu, możesz ustawić typ pola na "Czas" zamiast "BigDecimal". – davogones

+0

@senthil, po prostu próbował odtworzyć i podniósł wartość (time_stamp) został zapisany jako liczba. mongoid (3.0.23) – ted

Odpowiedz

2

Według this answer, typy liczbowe są obsługiwane przez MongoDB:

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) 

wzmocnione przez to stwierdzenie w Mongoid documentation:

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

BigDecimal 
Date 
DateTime 
Range 

nie wiem o rzeczach, które chcą z pole, ale jeśli naprawdę chcesz, aby było przechowywane jako liczba, musisz użyć innego typu liczbowego obsługiwanego przez MongoDB (BSON), prawdopodobnie Float lub Integer.

+0

Nie ma to znaczenia, ponieważ 'field: time_stamp, type: BigDecimal' określa obsługiwany typ pola BigDecimal. Powinien on być konwertowany na liczbę całkowitą przed zapisaniem na MongoDB. – davogones

+1

Myślę, że ** podwójne ** ma więcej sensu niż ** int32 ** dla ** dziesiętnej **, ale niewystarczające dla ** nierozdzielonego dziesiętnego ** (dlatego musi być przechowywane jako coś innego, jak **strunowy**). Jeśli twoje pole może być reprezentowane jako MongoDB ** int32 ** lub MongoDB ** int64 **, to zrób Mongoid ** Integer **, a nie Mongoid ** BigDecimal **. – michelpm

Powiązane problemy