【问题标题】:How to find documents whose age in days % 3 == 0 in Mongo?如何在 Mongo 中查找年龄 % 3 == 0 的文档?
【发布时间】:2013-11-19 21:14:55
【问题描述】:

每个文档都有一个时间戳,因此查找给定年龄的文档很简单。

如何查找年龄 % 3 == 0 的文档?在 Ruby 中做起来很简单,但是大部分文档都不需要,所以最好在 Mongo 中找到相关文档。

为什么?

要求是每 3 天向用户发送一次提醒。我可以安排一个任务每天(或每小时)运行。一种方法是每 3 天运行一次任务,但最好在他们注册后 3 天发送提醒,而不是在 4-6 天后发送。

此外,这似乎不是一个非常优雅的方法。有没有更好的方法可以每 3 天对文档执行一次操作?

Sinatra + Heroku + Mongo。

【问题讨论】:

  • 我认为它可能采取了错误的方式。我的观点是,有时甚至从哪里开始都不是很明显,尤其是像 MongoDB 这样想假装嵌套数据结构是一种查询“语言”的东西。
  • 这个问题似乎是题外话,因为没有采取任何努力

标签: ruby mongodb heroku


【解决方案1】:

假设:您的数据库中有以下带有时间戳的文档。

> db.dinner.find()
{ "_id" : ObjectId("527d4edc6acba77bbdbcdbc5"), "timestamp" : 1383857393558, "dinner" : "strawberries" }
{ "_id" : ObjectId("527d4ee96acba77bbdbcdbc6"), "timestamp" : 1383770993558, "dinner" : "cherries" }
{ "_id" : ObjectId("527d4f116acba77bbdbcdbc7"), "timestamp" : 1383684593558, "dinner" : "blueberries" }
{ "_id" : ObjectId("527d4fa36acba77bbdbcdbc8"), "timestamp" : 1383943793558, "dinner" : "cranberries" }
> 

然后您可以使用以下代码查找 0、3、6、9、... 天前创作的所有文档:

today = new Date();
db.dinner.find().forEach(
  function(entry) {
    daysAgo = Math.floor((today.getTime() - entry.timestamp) / 1000 / 60 / 60 / 24);
    if (daysAgo % 3 == 0) printjson(entry);
  }
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 2018-03-12
    相关资源
    最近更新 更多