【问题标题】:Querying a post by date (year and month) and slug按日期(年和月)和 slug 查询帖子
【发布时间】:2012-07-02 07:12:29
【问题描述】:

我正在尝试使用 Node.js 和 Express 创建一个博客系统。

每个article 都有一个slug,它被保存到数据库中。例如,hello-world。目前我可以只用它的 slug 访问一个帖子,例如/article/hello-world。

但是,我希望 URL 看起来更像这样:/article/:year/:month/:slug。例如,/article/2011/07/hello-world。我该怎么做?我目前正在使用 MongoDB 的 findOne 方法,并且在数据库中,我在名为 created_at 的字段中保存了一个时间戳。

【问题讨论】:

  • 这个问题实际上是关于如何进行 mongodb 查询,还是关于 node.js 以及如何配置您的 URL 模式?对我来说,这个问题似乎只应该被标记为 mongodb 并且与网络应用程序无关。另外,您当前的查询是什么样的?
  • 它可能应该被标记到 mongodb 上,但我想提供一些背景信息,也许这些社区中的一些人之前已经处理过这个问题。所以目前我的查询看起来像这样:articleModel.find({ slug: 'hello-world' }, function () { … });

标签: node.js mongodb express


【解决方案1】:

您可以进行日期范围查询:

db. article.findOne({
    created_at: { $gte: ISODate("2012-04-01"), $lte: ISODate("2012-04-30") }, 
    slug: "hello-world"
})

您的特定客户端语言(本例中为 node.js)我确信提供了更简单的方法来处理日期对象。

【讨论】:

  • 啊,我明白了。所以我们基本上是说在这个月内找到这篇文章。似乎是一个可行的解决方案,我只需要找到一种用 JavaScript 计算每月最后一天的方法,但我认为这回答了我的问题。谢谢。
  • 我必须给它一个 ISO 日期吗?这种格式怎么样:Tue Jul 31 2012 20:00:14 GMT+0100 (BST)?
  • 你在用猫鼬吗?我相信您只需使用 Date 对象,驱动程序就会为您处理格式。
  • 另一种解决方案是同时存储创建的年份和创建的月份 int,并对它们进行索引。如果您要进行大量这样的查询来解决您的帖子,从长远来看可能会更容易。
  • 这是性能和效率之间的权衡。 DB 中更多的整数 = 更大的 DB,而这种方法需要更多的计算。这是一个每天只有十几个请求的小型博客 - 你会怎么做?
【解决方案2】:

这听起来像是给定了带有年、月(作为 int?)和 slug 的 URL,您想查询匹配的第一篇文章。

如果年份是 YY,月份是 MM(1 到 12),则查询将是

db.article.findOne({slug: "slug", 
          created_at: {$gte: new Date(YY,MM-1), 
          $lt: new Date(YY, MM) })

Javascript Date 对象的月份是从零开始的,因此如果您在 1 月获得 01,则需要将 0 传递给 Date 以创建 1 月 1 日。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 2011-09-11
    • 1970-01-01
    相关资源
    最近更新 更多