2011-11-21 55 views
27

我想实现主题的“凹凸”功能。一旦碰到话题,它会有一个新的“bump_date”字段。我想对它进行排序,以便在出现“bump_date”字段时将其排序,就好像它是“已创建”字段一样。这里是我的db.topics的例子:MongoDB排序

{ 
    "text" : "test 1", 
    "created" : "Sun Nov 20 2011 02:03:28 GMT-0800 (PST)" 
}, 
{ 
    "text" : "test 2", 
    "created" : "Sun Nov 18 2011 02:03:28 GMT-0800 (PST)" 
}, 
{ 
    "text" : "test 3", 
    "created" : "Sun Nov 17 2011 02:03:28 GMT-0800 (PST)", 
    "bump_date: : "Sun Nov 19 2011 02:03:28 GMT-0800 (PST)" 
} 

我想要的那种在“测试1”,为了回报,“考3”,“测试2”

+0

它可能有助于MongoDB排序http://www.code-sample.com/2016/07/mongodb-sort-by-date.html –

回答

69

MongoDB中排序就像做所以:

db.collection.find({ ... spec ... }).sort({ key: 1 })

其中1的上升和-1正在下降。

在您的具体示例中:db.topics.find().sort({ bump_date: 1 }),尽管最好称它为“updated_at”。

你也一定会在你的“bump_date”字段中加上一个索引。

+2

为了达到预期的效果,我认为OP需要设置'第一次保存文档时将bump_date'设置为'created'。然后,按照您的建议,您总是按照'bump_date'和索引进行排序。 – dcrosta

+1

这是真的,可能应该创建,以便收集可以最终压缩。或者,[稀疏索引](http://www.mongodb.org/display/DOCS/Indexes#Indexes-SparseIndexes)。 –

2

目前,它是不可能在MongoDB中根据多个columns.eg用户定义的标准进行排序的。此功能会一直返回bump_date如果它被设置,否则返回created

要么你将不得不使用服务器端或客户端代码这里提到:

Mongo complex sorting?

或如果你想留在基本quering和排序,你应该:

  • 创造created关键bump_date相当于只要创建一个新的记录。这将会造成数据开销,因为你可以预计你的每个主题将来都会碰到一段时间,因此bump_date字段最终会被添加。所以从开始本身添加它。

  • 每当文章被碰撞时,请更新字段bump_date

你的榜样文件,将这个样子这种变化:

{ 
    "text" : "test 1", 
    "created" : "Sun Nov 20 2011 02:03:28 GMT-0800 (PST)", 
    "bump_date" : "Sun Nov 20 2011 02:03:28 GMT-0800 (PST)" 
}, 
{ 
    "text" : "test 2", 
    "created" : "Sun Nov 18 2011 02:03:28 GMT-0800 (PST)", 
    "bump_date" : "Sun Nov 18 2011 02:03:28 GMT-0800 (PST)" 
}, 
{ 
    "text" : "test 3", 
    "created" : "Sun Nov 17 2011 02:03:28 GMT-0800 (PST)", 
    "bump_date: : "Sun Nov 19 2011 02:03:28 GMT-0800 (PST)" 
} 

您应ensureIndex上bump_date场。现在您可以轻松查询所需的数据。

db.topics.find().sort({ bump_date: 1 }) 
+0

whyIndex应该应用于bump_date? –

5

正如Brian Hicks所建议的那样,创建一个额外的updated_at字段是最好的选择。这样,当创建文档时,您可以使created_at和updated_at最初相同。

{ 
    "created_at": xxx, 
    "updated_at": xxx 
} 

如果你那么当有可以排序上的updated_at领域实现你的愿望订购一个撞击事件将其设置为当前时间“撞击”的updated_at领域。

4

另外:

db.collection.find({ $query: {}, $orderby: { column : -1 } }) 

其中1是升序和-1是下降。