2014-07-01 161 views
6

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

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

但是,我不会按降序顺序按时间戳排序结果。我想这是因为时间戳被视为一个int字段。有没有改变时间戳字段的数据类型的工作。我已经在这个集合中有很多的数据,所以不想经过导入/导出的麻烦等。

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

要清楚:时间戳并不表示何时创建文档并将其存储为字符串(例如“1404217646”)。

在此先感谢。

+0

比较两个查询我假设你已经进口,否则将被表示为'pymongo.DESCENDING'常数。但实际上,这只是'-1'的一个常数,可以让阅读更轻松。作为'int'应该不重要,因为值应该以这种方式排序。这些实际上可能是字符串?意思是,当你查看shell中的数据时,会出现''“''这些引号吗? –

+0

yes - 引号出现 - 因此时间戳存储为字符串..并且我正在寻找解决方法而不更改所有现有文档中此字段的数据类型 – jisu

+0

真的没有解决方法。即使作为字符串,它仍应该正确排序,因为这些值是词法。除非有些是数字,有些则是字符串,这会导致问题。如果您正在寻找一种方式让MongoDB“投射”值,那么除了字符串hackery之外,这不会发生,但这不会有效。你真的需要改变类型。最佳形式是作为BSON日期,它只是在内部存储时间戳值,但会自动在日程表中投射。 –

回答

15

假设您的时间戳指示何时创建文档,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

+0

时间戳并不表示文档何时被创建 - 所以上述不起作用。这两种解决方案不一样吗? – jisu

+0

你是对的 - 修好了。第二种解决方案有效?如果不是,您可能需要将数据映射到相同的类型。 Theres快速的方式为 –

+0

第二种解决方案也不工作,时间戳存储为一个字符串。我有我的排序var实现如此:[('timestamp',-1)]。 无论如何,我会对如何“将数据映射到相同类型”感兴趣。我想,最终的解决方案将是重建文档,以便所有的时间戳都以bson日期格式存储。 – jisu

4

您可以通过使用sort({ 'timestamp': -1 })。您的查询降序排序会是这样

排序您的收藏
collection.find().sort({ 'timestamp': -1 }).limit(10) 

如果你有SQL的知识,您可以通过以下链接

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

+0

应该指出,即使这是行之有效的,因为它是一个单一的领域,你排序它不是最好的方式来做蟒蛇,因为它是无序的 – Sammaye

+0

@Sammaye,我认为有多个字段和时间戳是一个集合中的共同领域。 – Mulagala

+0

文档本身有多个字段,但在排序规范中,您只提供一个字段。 – Sammaye