【问题标题】:Querying mongodb for documents by age按年龄查询mongodb文档
【发布时间】:2017-12-06 11:16:01
【问题描述】:

我想按月从我的收藏中删除所有超过 1 个月的文档。集合中的示例文档如下所示:

{
    _id: ObjectId("56e75f1ce851695805ead8ae"),
    createDate: ISODate("2016-03-15T01:02:20.821Z"),
    foo: "bar"
}

我希望自动安排这个任务发生,这样它就不需要人工输入——比如说,作为一个 cron 作业——所以我希望它的逻辑尽可能少。

如何查询 createDate 超过 1 个月的文档?我曾想过尝试这样的事情:

db.col.find({createDate: {$lt: ISODate(ISODate().getTime() - 1000*3600*24*30)}});

... 我创建了一个新的 ISODate,当前时间减去 1 个月的毫秒数,但这并没有返回任何数据。它也有点丑陋,即使它确实有效。我将如何实现这一目标?

【问题讨论】:

  • 在这里您可以找到一些可行的解决方案stackoverflow.com/questions/19819870/…
  • 我真的看不到我的问题的答案。我已经知道如何根据静态 ISODate 进行查询,但这不是我的问题。

标签: mongodb


【解决方案1】:

您可以创建 TTS 索引来删除超过 30 天的数据。它会在 30 天后自动删除数据。

db.col.createIndex( { "createDate": 1 }, { expireAfterSeconds: 2592000 } )

【讨论】:

  • 现在这是一个非常有趣的方法。我可能最终会使用它而不是我的答案!
【解决方案2】:

好吧,我想通了。看来我的语法有点错误......老实说,不完全确定这个正确的语法是如何工作的,但它可以满足我的需要。

db.col.find({createDate: {$lt: new Date((new Date())-1000*3600*24*30)}});

【讨论】:

  • 这应该不是一个真正的问题,但如果您将 MongoDB 部署在全球不同的实例中,您可能需要确保服务器都在同一个时区。我认为new Date() 使用系统时间而不是UTC
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2011-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多