2013-05-25 10 views
9

Scenario: Considerare Sto avendo una collezione chiamata MyCollection, con i seguenti dati:Come interrogare l'intervallo di date sulla raccolta MongoDB in cui la data ISO è memorizzata nel campo stringa?

{ 
    "_id" : 'MyUniqueID_01' 
    "CreatedTime" : "2013-12-01T14:35:00Z", 
    "LastModifiedTime" : "2013-12-01T13:25:00Z" 
} 

Ora voglio interrogare il database MongoDB in cui il tipo di cui sopra dei dati è in enorme numero di documenti. E la mia domanda è basata su di date vale a dire utilizzando $gt, $gte, $lt & $lte

Quindi la mia domanda potrebbe essere qualcosa di simile:

db.MyCollection.find({ 'CreatedTime': {$gt: '2013-05-25T09:29:40.572Z'}}) 

Considerando gli esempi di cui sopra Il risultato atteso è, interrogazione ha per ottenere un documento (dal "CreatedTime": "2013-12-01T14: 35: 00Z" è maggiore del valore passato nella query "2013-05-25T09: 29: 40.572Z"); mentre non lo è, il problema è che il campo CreatedTime è in formato stringa.

Domanda: C'è un modo per poter ottenere il risultato previsto perfettamente senza modificare il tipo di campo stringa fino ad oggi?

+1

Le stringhe di data e ora ISO 8601 come queste dovrebbero funzionare correttamente per le query dell'intervallo di date. Questo è uno dei vantaggi del formato. La tua query di esempio restituisce il tuo documento di esempio, come previsto. – JohnnyHK

+0

@JohnnyHK: Grazie ... Funziona esattamente sul mio DB locale ma la stessa query non funziona sul server live. Esistono dipendenze di versioni? –

+0

@AmolMKulkarni Per curiosità, hai scoperto perché non ha funzionato sul server? Sto lavorando sull'interrogazione tra fasce orarie e ci siamo imbattuti durante la ricerca. – Raghuveer

risposta

9

È possibile effettuare le query esattamente come nell'esempio.

L'ordinamento delle stringhe è coerente e fornirà la relazione esatta desiderata.

+3

Sì, ma vorrei anche aggiungere che la stringa di query deve utilizzare lo stesso suffisso del fuso orario del set di dati (che aggiunge anche un altro vincolo su come stai memorizzando le stringhe di dati) perché stai facendo un confronto tra stringhe.Ad esempio, l'esempio dell'OP è in formato ISO 8601 UTC (con il suffisso 'Z'), quindi la stringa di query deve anche essere in quella forma. –