2013-04-24 10 views
13

Sono nuovo di Mongoid. Nel mio file di modello, ho creato un campo con tipo di dati BigDecimal. Voglio memorizzare l'ora in esso. Qui di seguito è il modello che sto usando:Memorizzazione del timestamp come numero Mongolo

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

e sotto v'è il codice che sto usando per creare un documento:

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

vedo che il time_stamp viene memorizzato come stringa nel Banca dati. Qualcuno può dirmi di memorizzare il timestamp come numero in DB in modo da poter eseguire alcune operazioni su di esso. Grazie in anticipo.

+2

Per memorizzare timestamp, è necessario 'includere Mongoid :: Timestamps'. Ciò creerà: created_at &: updated_at i campi del documento. Non sei sicuro di come il tuo campo ': time_stamp' sia magicamente popolato da una stringa temporale. – brayne

+0

Questo potrebbe essere un bug nel driver MongoDB di Mongoid, Ciclomotore. Puoi pubblicare i dati che puoi vedere interrogando nella shell di mongo? Se si desidera solo memorizzare il timestamp, è sufficiente impostare il tipo di campo su "Ora" invece di "BigDecimal". – davogones

+0

@senthil, ho appena provato a riprodurre e alzato il valore (time_stamp) è stato memorizzato come un numero. mongoid (3.0.23) – ted

risposta

2

Secondo this answer, i tipi numerici supportati da MongoDB sono:

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) 

rinforzata da questa dichiarazione nel Mongoid documentation:

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

BigDecimal 
Date 
DateTime 
Range 

Non so circa le cose che desiderate con il campo, ma se lo si desidera veramente memorizzato come un numero, è necessario utilizzare un diverso tipo numerico supportato da MongoDB (BSON), probabilmente Float o Integer.

+0

Questo non è rilevante perché 'campo: time_stamp, type: BigDecimal' specifica un tipo di campo supportato, BigDecimal. Dovrebbe essere convertito in un numero intero prima di essere archiviato su MongoDB. – davogones

+1

Penso che ** double ** abbia più senso di ** int32 ** per un ** decimale **, ma non abbastanza per un ** decimale non limitato ** (quindi deve essere memorizzato come qualcos'altro, come un **stringa**). Se il tuo campo può essere rappresentato come un MongoDB ** int32 ** o MongoDB ** int64 **, allora rendilo un Mongoide ** Intero **, non Mongoide ** BigDecimale **. – michelpm

Problemi correlati