【问题标题】:sort mongodb documents by timestamp (in desc order)按时间戳对 mongodb 文档进行排序(按 desc 顺序)
【发布时间】:2014-08-21 12:16:03
【问题描述】:

我在 mongodb 中有一堆文档,并且都有一个时间戳字段,时间戳存储为“1404008160”。我想按 desc 顺序对该集合中的所有文档进行排序。我这样做:

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

但是,我没有得到按时间戳按 desc 顺序排序的结果。我认为这是因为时间戳被视为一个 int 字段。在不更改时间戳字段的数据类型的情况下是否可以解决此问题。我已经在这个集合中有很多数据,所以不想经历导入/导出等的麻烦。

另外 - 我想保持负载排序到 mongodb,而不是在 python 中以编程方式进行。

需要说明的是:时间戳不表示文档的创建时间,它以字符串形式存储(例如“1404217646”)。

提前致谢。

【问题讨论】:

  • 我假设您已经导入了原本会表示为 pymongo.DESCENDING 的常量。但实际上,这只是-1 的常量,以使阅读更容易。作为 int 应该无关紧要,因为值应该以这种方式排序。可能这些实际上是字符串?意思是,当您查看 shell 中的数据时,这些引号 "" 会出现吗?
  • 是的 - 引号确实出现了 - 所以时间戳存储为字符串.. 我正在寻找一种解决方法,而不在所有现有文档中更改此字段的数据类型
  • 确实没有解决方法。即使作为字符串,这仍然应该正确排序,因为值是词法的。当然,除非有些是数字,有些是字符串,否则会导致问题。如果您正在为 MongoDB 寻找一种“转换”值的方法,那么除了字符串黑客之外,这不会发生,但这不会有效。你真的需要改变类型。最好的形式是作为 BSON 日期,它只是在内部存储时间戳值,但会在您的程序中自动转换为日期。
  • 好吧 - 我最终重建了所有文档

标签: python mongodb timestamp


【解决方案1】:

假设您的时间戳表示文档的创建时间,you can use _id instead

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

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

如果您仍想按您的自定义 timestamp 字段进行排序,以下应该可以工作:

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

请注意,这是假设您的所有 timestamp 字段都属于同一类型(stringint

【讨论】:

  • 时间戳不指示文档的创建时间 - 因此上述方法不起作用。两种解决方案不一样吗?
  • 你是对的 - 已修复。第二种解决方案有效吗?如果不是,您可能需要将数据映射到相同的类型。有一个快速的方法
  • 第二种解决方案也不起作用,因为时间戳存储为字符串。我的排序变量是这样实现的:[('timestamp', -1)]。无论如何,我很想知道如何“将数据映射到同一类型”。我在想,最终的解决方案是重建文档,使所有的时间戳都以 bson 日期格式存储。
  • 根据您的字符串的格式,排序仍然可以工作。一个示例是,如果格式是 YYYY-MM-DD HH:MM 的变体,其中 HH 在 [00, 23] 范围内。
  • 我遵循相同的步骤,但它返回 TypeError: 如果没有指定方向,key_or_list 必须是列表的实例,``` >>> for x in post.find(): .. . print(x['timestamp']) ... 时间戳(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/

【讨论】:

  • 应该注意的是,即使这有效,因为它是一个单独的字段,您正在按它进行排序不是在 python 中执行此操作的最佳方法,因为 dicts 是无序的
  • @Sammaye,我认为有多个字段,时间戳是集合中的一个公共字段。
  • 文档本身有多个字段,但在排序规范中您只提供一个字段。
  • 建议的解决方案是否与:collection.find(limit=10).sort( { 'timestamp': -1 } )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
  • 2011-06-28
  • 2020-07-05
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
相关资源
最近更新 更多