2014-07-01 8 views
6

Ho un mucchio di documenti in mongodb e tutti hanno un campo data/ora con data/ora memorizzato come "1404008160". Voglio ordinare tutti i documenti in questa raccolta in ordine decrescente. Lo faccio da:ordina documenti mongodb per data e ora (in ordine discendente)

sort = [('timestamp', DESCENDING)] 
collection.find(limit=10).sort(sort) 

Tuttavia, non ottengo risultati ordinati per data e ora in ordine di discesa. Penso che sia perché il timestamp viene trattato come un campo int. C'è un lavoro attorno a questo senza cambiare il tipo di dati del campo data/ora. Ho già molti dati in questa collezione quindi non voglio passare attraverso il fastidio di import/export, ecc.

Inoltre, voglio mantenere il carico per l'ordinamento su mongodb piuttosto che farlo a livello di codice in python .

Per essere chiari: la data/ora non indica quando il documento è stato creato e viene memorizzato come stringa (ad esempio "1404217646").

Grazie in anticipo.

+0

presumo aver importato le costanti che altrimenti sarebbero rappresentati come 'pymongo.DESCENDING'. Ma in realtà questa è solo una costante per '-1' per facilitare la lettura. Come un 'int' non dovrebbe avere importanza in quanto i valori dovrebbero essere ordinati in quel modo. Forse queste sono effettivamente stringhe? Significato, queste virgolette '" "' appaiono quando guardi i dati nella shell? –

+0

sì - le virgolette appaiono - quindi il timestamp è memorizzato come stringa .. e sto cercando una soluzione alternativa senza modificare il tipo di dati di questo campo in tutti i documenti esistenti – jisu

+0

Non c'è davvero una soluzione alternativa. Anche se le stringhe dovrebbero essere ordinate correttamente, i valori sono lessicali. A meno che alcuni siano numeri e alcuni siano stringhe, il che causerà un problema. Se stai cercando un modo per MongoDB di "castare" i valori, allora questo non accadrà, al di fuori degli hacker delle stringhe, ma ciò non sarebbe efficiente. Hai davvero bisogno di cambiare il tipo. La forma migliore è una data BSON, che memorizza solo internamente il valore del timestamp, ma verrà automaticamente trasmesso come date nel programma. –

risposta

15

Supponendo che il timestamp indichi quando il documento è stato creato, you can use _id instead.

_id ObjectId in mongo memorizza il timestamp. Provare quanto segue:

sort = {'_id': -1} 
collection.find({}, limit=10).sort(sort) 

Se si vuole ancora ordinare dal proprio campo personalizzato timestamp, il seguente dovrebbe funzionare:

sort = {'timestamp': -1} 
collection.find({}, limit=10).sort(sort) 

Si noti che questo sta assumendo tutti i timestamp campi sono dello stesso tipo (string, int)

+0

Il timestamp non indica quando il documento è stato creato - quindi quanto sopra non funzionerà. Le due soluzioni non sono le stesse? – jisu

+0

Hai ragione - Risolto. La seconda soluzione funziona? In caso contrario potrebbe essere necessario mappare i dati allo stesso tipo. C'è un modo rapido per quello –

+0

Anche la seconda soluzione non funziona in quanto il timestamp è memorizzato come una stringa. Ho implementato la mia specie var come tale: [('timestamp', -1)]. Ad ogni modo, sarei interessato a sapere come posso "mappare i dati allo stesso tipo". La soluzione finale, sto pensando, sarà quella di ricostruire i documenti in modo che tutti abbiano il timestamp memorizzato in formato data bson. – jisu

4

È possibile ordinare la vostra collezione in ordine decrescente utilizzando sort({ 'timestamp': -1 }) interrogazione .Your sarà come questo

collection.find().sort({ 'timestamp': -1 }).limit(10) 

Se si dispone di conoscenze di SQL, è possibile confrontare entrambe le query nel seguente link

http://docs.mongodb.org/manual/reference/sql-comparison/

+0

Va notato che anche se questo funziona poiché si tratta di un singolo campo che stai ordinando da esso non è il modo migliore di farlo in python dato che i dict sono non ordinati – Sammaye

+0

@Sammaye, ho pensato che ci siano più file e timestamp è un campo comune nella collezione. – Mulagala

+0

Ci sono più campi nei documenti stessi ma all'interno della specifica di ordinamento si sta fornendo solo un campo. – Sammaye