MongoDB排序

38

我想为主题实现一个“提升”功能,一旦主题被提升,它将拥有一个新的“bump_date”字段。我希望对其进行排序,以便当存在“bump_date”字段时,它将像“created”字段一样进行排序。以下是我的db.topics示例:

{
    "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)"
}

我希望排序的顺序是"test 1", "test 3", "test 2"


它可能有助于 MongoDB 排序 http://www.code-sample.com/2016/07/mongodb-sort-by-date.html - Anil Singh
4个回答

89

2
为了使其按预期工作,我认为 OP 需要在第一次保存文档时将 bump_date 设置为 created。然后您始终按 bump_date 进行排序并对其进行索引,就像您建议的那样。 - dcrosta
1
这是正确的,也许应该创建这样的集合,以便最终可以进行压缩。或者使用稀疏索引。 - Brian Hicks

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

其中1代表升序,-1代表降序。


你三年后回答我,当然会有变化...现在又变了... - Oneide Luiz Schneider

5

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

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

如果您在“bump”事件发生时将updated_at字段设置为当前时间,则可以通过对updated_at字段进行排序来实现所需的排序。


3

目前在 mongodb 中无法根据用户定义的多个列进行排序。例如:如果设定了 bump_date,则返回其值,否则返回 created的功能,目前是无法实现的。

您可以使用以下服务器端或客户端代码来解决这个问题:

Mongo complex sorting?

或者,如果您想使用基本的查询和排序,则应执行以下操作:

  • 创建一个等同于createdbump_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操作。这样,您就可以轻松查询所需的数据。

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

为什么应该将 ensureIndex 应用于 bump_date? - Alexander Beletsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接