сортировка документов mongodb по метке времени (в порядке убывания)

#python #mongodb #timestamp

#python #mongodb #временная метка

Вопрос:

У меня есть куча документов в mongodb, и у всех есть поле метки времени с меткой времени, хранящейся как «1404008160». Я хочу отсортировать все документы в этой коллекции по порядку убывания. Я делаю это с помощью:

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

Однако я не получаю результаты, отсортированные по метке времени в порядке убывания. Я думаю, это потому, что временная метка обрабатывается как поле int. Есть ли способ обойти это без изменения типа данных поля временной метки. У меня уже есть много данных в этой коллекции, поэтому я не хочу проходить через хлопоты по импорту / экспорту и т.д.

Также — я хочу сохранить загрузку для сортировки в mongodb, а не делать это программно на python.

Для ясности: временная метка не указывает, когда был создан документ, и она хранится в виде строки (например, «1404217646»).

Заранее спасибо.

Комментарии:

1. Я предполагаю, что вы импортировали константы, которые в противном случае были бы представлены как pymongo.DESCENDING . Но на самом деле это просто константа для -1 облегчения чтения. Как int не должно иметь значения, поскольку значения должны располагаться таким образом. Возможно, это действительно строки? Значение, появляются ли эти кавычки "" при просмотре данных в оболочке?

2. да — кавычки появляются — поэтому временная метка сохраняется в виде строки .. и я ищу обходной путь без изменения типа данных этого поля во всех существующих документах

3. На самом деле нет обходного пути. Даже в виде строк это все равно должно правильно сортироваться, поскольку значения являются лексическими. Если, конечно, некоторые из них не являются числами, а некоторые — строками, что вызовет проблему. Если вы ищете способ для MongoDB «приводить» значения, то этого не произойдет, за исключением взлома строк, но это было бы неэффективно. Вам действительно нужно изменить тип. Лучшая форма — это дата в формате BSON, которая просто сохраняет значение временной метки внутри, но автоматически преобразуется в даты в вашей программе.

4. ну, в итоге я восстановил все документы

Ответ №1:

Предполагая, что ваша временная метка указывает, когда документ был создан, вы можете использовать _id вместо.

_id ObjectId в mongo хранит вашу временную метку. Попробуйте следующее:

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

Если вы все еще хотите выполнить сортировку по своему пользовательскому timestamp полю, должно сработать следующее:

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

Обратите внимание, что это предполагает, что все ваши timestamp поля имеют один и тот же тип ( string , int )

Комментарии:

1. Временная метка не указывает, когда был создан документ, поэтому вышеуказанное не сработает. Разве эти два решения не одинаковы?

2. Вы правы — исправлено. Второе решение работает? В противном случае вам может потребоваться сопоставить ваши данные с тем же типом. Для этого есть быстрый способ

3. Второе решение также не работает, поскольку временная метка хранится в виде строки. У меня реализован параметр сортировки следующим образом: [(‘timestamp’, -1)]. В любом случае, мне было бы интересно узнать, как я могу «сопоставить данные с тем же типом». Я думаю, что конечным решением будет восстановить документы, чтобы все они имели временную метку, сохраненную в формате даты bson.

4. В зависимости от того, как отформатирована ваша строка, сортировка все еще может работать. Одним из примеров является вариант формата, YYYY-MM-DD HH:MM где HH находится в диапазоне [00, 23].

5. Я выполняю тот же шаг, но он возвращает ошибку типа: если направление не указано, key_or_list должен быть экземпляром списка « >>> для x в post.find(): … print(x[‘отметка времени’]) … Временная метка (1591790235, 1) Временная метка (1591790259, 1) Временная метка (1591790271, 1) «

Ответ №2:

Вы можете отсортировать свою коллекцию в порядке убывания с помощью sort( { 'timestamp': -1 } ) .Ваш запрос будет выглядеть следующим образом

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

Если у вас есть знания sql, вы можете сравнить оба запроса по следующей ссылке

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

Комментарии:

1. Следует отметить, что, хотя это работает, поскольку это единственное поле, по которому вы сортируете, это не лучший способ сделать это в python, поскольку dicts неупорядочены

2. @Sammaye, я думал, что есть несколько файлов, а временная метка является общим полем в коллекции.

3. В самих документах есть несколько полей, но в спецификации сортировки вы указываете только одно поле.

4. Разве предлагаемое решение не такое же, как: collection.find(limit= 10).sort( { ‘timestamp’: -1 } )