Python 按时间戳对mongodb文档进行排序(按描述顺序)

Python 按时间戳对mongodb文档进行排序(按描述顺序),python,mongodb,timestamp,Python,Mongodb,Timestamp,我在mongodb中有一堆文档,所有文档都有一个时间戳字段,时间戳存储为“1404008160”。我想按描述顺序对集合中的所有文档进行排序。我通过以下方式做到这一点: sort = [('timestamp', DESCENDING)] collection.find(limit=10).sort(sort) 然而,我并没有得到按时间戳按desc顺序排序的结果。我认为这是因为时间戳被当作一个整型字段。在不更改时间戳字段的数据类型的情况下,是否有解决方法。我已经收集了大量数据,因此不想经历导入/

我在mongodb中有一堆文档,所有文档都有一个时间戳字段,时间戳存储为“1404008160”。我想按描述顺序对集合中的所有文档进行排序。我通过以下方式做到这一点:

sort = [('timestamp', DESCENDING)]
collection.find(limit=10).sort(sort)
然而,我并没有得到按时间戳按desc顺序排序的结果。我认为这是因为时间戳被当作一个整型字段。在不更改时间戳字段的数据类型的情况下,是否有解决方法。我已经收集了大量数据,因此不想经历导入/导出等麻烦

另外,我希望保留mongodb排序的负载,而不是在python中以编程方式进行排序


需要明确的是:时间戳并不表示文档是何时创建的,它存储为字符串(例如“1404217646”)


提前谢谢

假设您的时间戳指示文档的创建时间

\u id
mongo中的ObjectId存储您的时间戳。请尝试以下操作:

sort = {'_id': -1}
collection.find({}, limit=10).sort(sort)
如果仍要按自定义的
时间戳
字段进行排序,则应使用以下方法:

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

请注意,这是假设所有
时间戳
字段的类型都相同(
字符串
int

您可以使用
排序({'timestamp':-1})
对集合进行降序排序。您的查询如下所示

collection.find().sort( { 'timestamp': -1 } ).limit(10)
如果您有sql知识,可以在下面的链接中比较这两个查询


我假设您已经导入了常量,否则将表示为
pymongo.DESCENDING
。但实际上这只是
-1
的一个常数,以使阅读更容易。作为一个
int
不应该重要,因为值的顺序应该是这样的。这些可能真的是字符串吗?也就是说,当您查看shell中的数据时,这些引号是否会出现?是的-引号会出现-因此时间戳存储为字符串。。我正在寻找一种不改变所有现有文档中该字段的数据类型的解决方法。实际上,这不是一种解决方法。即使是字符串,也应该正确排序,因为值是词法的。当然,除非有些是数字,有些是字符串,这会引起问题。如果您正在寻找MongoDB“转换”值的方法,那么除了string hackery之外,这是不会发生的,但这是没有效率的。你真的需要改变类型。最好的形式是作为BSON日期,它只在内部存储时间戳值,但会在程序中自动转换为日期。好吧,我最终重建了所有文档。应该注意的是,尽管这是一个单独的字段,但在python中按它排序并不是最好的方式,因为dict是unordered@Sammaye,我认为集合中有多个字段,时间戳是一个公共字段。文档本身有多个字段,但在排序规范中,您只提供了一个字段。建议的解决方案与:collection.find(limit=10).sort({‘timestamp’:-1})不一样吗时间戳并不表示文档是在什么时候创建的,所以上面的方法不起作用。这两种解决方案不一样吗?你是对的。第二种解决方案有效吗?如果没有,您可能需要将数据映射到同一类型。有一种快速的方法,第二种解决方案也不起作用,因为时间戳存储为字符串。我的sort变量是这样实现的:[('timestamp',-1)]。无论如何,我想知道如何“将数据映射到同一类型”。我想,最终的解决方案是重建文档,使所有文档都以bson date格式存储时间戳。根据字符串的格式,排序仍然可以工作。例如,如果格式是
YYYY-MM-DD HH:MM
的变体,其中HH在[00,23]的范围内。我遵循相同的步骤,但它返回TypeError:如果未指定方向,则键\u或\u list必须是列表的实例,``>>表示post中的x.find():。。。打印(x[“时间戳])。。。时间戳(1591790235,1)时间戳(1591790259,1)时间戳(1591790271,1)```