2014-07-01 21 views
6

Mam kilka dokumentów MongoDB i wszystkie mają pola datownika z datą zapisanego jako „1404008160”. Chcę posortować wszystkie dokumenty w tej kolekcji według kolejności opisów. Robię to przez:rodzaj MongoDB dokumenty według znacznika czasu (w kolejności malejąco)

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

Jednak nie otrzymuję wyników posortowanych według znacznika czasowego w porządku malejącym. Myślę, że to dlatego, że znacznik czasu jest traktowany jako pole int. Czy jest to obejście bez zmiany typu danych pola znacznika czasu. Mam już wiele danych w tej kolekcji, więc nie chcę przechodzić przez kłopotów z importem/eksportem, itp.

Również - Chcę zachować ładunek do sortowania do mongodb zamiast robić to programowo w pythonie .

Żeby było jasne: Znacznik czasu nie wskazuje, kiedy dokument został utworzony i jest on przechowywany jako ciąg znaków (na przykład „1404217646”).

Z góry dziękuję.

+0

Zakładam zaimportowaniu stałe, które w przeciwnym razie byłyby reprezentowane jako 'pymongo.DESCENDING'. Ale tak naprawdę to jest tylko stała dla "-1", aby ułatwić czytanie. Jako "int" nie powinno mieć znaczenia, ponieważ wartości powinny zamawiać w ten sposób. Być może są to faktycznie łańcuchy? Czy te cytaty "" "pojawiają się, gdy patrzysz na dane w powłoce? –

+0

tak - cytuje zrobić pojawia się - tak timestamp jest przechowywany jako ciąg .. i szukam obejście bez zmiany typu danych tej dziedzinie we wszystkich istniejących docs – jisu

+0

Tam naprawdę nie jest to obejście. Nawet jako ciągi powinny to być poprawnie posortowane, ponieważ wartości są leksykalne. O ile oczywiście niektóre z nich są liczbami, a niektóre są ciągami, co spowoduje problem. Jeśli szukasz sposobu na MongoDB do "rzucania" wartościami, to tak się nie stanie, poza hackery string, ale to nie byłoby wydajne. Naprawdę musisz zmienić typ. Najlepszą formą jest data BSON, która po prostu wewnętrznie przechowuje wartość znacznika czasu, ale automatycznie będzie rzutować jako daty w twoim programie. –

Odpowiedz

15

Zakładając swój znacznik czasu wskazuje, kiedy dokument został stworzony, you can use _id instead.

_id ObjectId w Mongo przechowuje znacznik czasu. Spróbuj wykonać następujące czynności:

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

Jeśli nadal chcesz, aby posortować według swojej dziedzinie niestandardowych timestamp, następujące powinny działać:

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

pamiętać, że jest zakładając wszystkich dziedzinach timestamp są tego samego typu (string, int)

+0

Datownik nie wskazują, kiedy dokument został stworzony - więc powyższe nie zadziała. Czy oba rozwiązania nie są takie same? – jisu

+0

Masz rację - naprawiono. Drugie rozwiązanie działa? Jeśli nie, możesz zmapować swoje dane na ten sam typ. Jest szybka droga do tego –

+0

Drugie rozwiązanie również nie działa, ponieważ znacznik czasu jest przechowywany jako ciąg. Mam zaimplementowany mój var var: [('timestamp', -1)]. W każdym razie chciałbym wiedzieć, jak mogę "mapować dane na ten sam typ." Rozumiem, że ostatecznym rozwiązaniem będzie rekonstrukcja dokumentów, więc wszystkie mają sygnaturę czasową zapisaną w formacie dat. – jisu

4

można posortować swoją kolekcję w porządku malejącym za pomocą sort({ 'timestamp': -1 }) .Twoje zapytanie będzie tak

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

Jeśli masz sql wiedzy, można porównać oba pytania w poniższym linku

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

+0

Należy zauważyć, że nawet jeśli to działa, ponieważ jest to pojedyncze pole, które sortujesz według niego, nie jest to najlepszy sposób na zrobienie tego w pythonie, ponieważ dyktanda są nieuporządkowane. – Sammaye

+0

@Sammaye, Myślałem, że istnieje wiele plików i znaczników czasu wspólne pole w kolekcji. – Mulagala

+0

Istnieje wiele pól w samych dokumentach, ale w ramach specyfikacji sortowania dostarczasz tylko jedno pole. – Sammaye