【问题标题】:MongoDB sortingMongoDB 排序
【发布时间】:2011-11-21 02:54:57
【问题描述】:

我想为主题实现“碰撞”功能。一旦一个主题被碰撞,它将有一个新的“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


【解决方案1】:

MongoDB 中的排序是这样完成的:

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

其中1 是升序,-1 是降序。

在您的具体示例中:db.topics.find().sort({ bump_date: 1 }),尽管将其称为“updated_at”可能会更好。

您肯定还想在“bump_date”字段上放置一个索引。

【讨论】:

  • 为了使其按预期工作,我认为 OP 在第一次保存文档时需要将 bump_date 设置为 created。然后,您始终按照您的建议按bump_date 排序并为其编制索引。
  • 确实如此,并且可能应该创建以便最终可以压缩集合。或者,sparse indexes.
【解决方案2】:

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

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

如果您随后通过将 updated_at 字段设置为发生碰撞事件的当前时间来“碰撞”该字段,您可以对 updated_at 字段进行排序以实现您想要的排序。

【讨论】:

    【解决方案3】:

    还有:

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

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

    【讨论】:

    【解决方案4】:

    目前在 mongodb 中不可能根据用户定义的标准对多个列进行排序。例如。这里的函数是返回bump_date,如果设置了,否则返回created

    您必须使用此处提到的服务器端或客户端代码:

    Mongo complex sorting?

    或者如果你想保持基本的查询和排序,你应该:

    • 每当创建新记录时,创建一个等效于 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)"
    }
    

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

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

    【讨论】:

    • 为什么要对bump_date应用ensureIndex?
    猜你喜欢
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多