【问题标题】:Remove old records in mongodb based on Month根据 Month 删除 mongodb 中的旧记录
【发布时间】:2013-09-14 00:25:59
【问题描述】:

我正在尝试删除我收藏中的旧记录。

我有一个名为“user_track”的集合,其中包含如下所示格式的数据

db.user_track.find().pretty()
{
        "_id" : ObjectId("50c9afe5765fb0e4fea076ce"),
        "cust_id" : "ddddd",
        "symbol" : "WWWW",
        "access_time" : "Thu Dec 13 2012 05:37:25 GMT-0500 (EST)"
}
{
        "_id" : ObjectId("50c9afe7765fb0e4ffa076ce"),
        "cust_id" : "eeeeeeeeee",
        "symbol" : "WFC",
        "access_time" : "Thu Dec 13 2012 05:37:27 GMT-0500 (EST)"
}
{
        "_id" : ObjectId("522de3ae2191b0e41a7534dd"),
        "cust_id" : "dsdsds",
        "symbol" : "APPLE",
        "access_time" : "Mon Sep 09 2013 11:05:18 GMT-0400 (EDT)"
}

在我的集合 user_track 中,我只想保留当月的数据(即从 2013 年 9 月 1 日到当天),并想删除不属于当月的其余记录

我尝试发出以下命令,但我不确定如何发出此命令以满足我的要求,因为我拥有的日期格式不同。

db.user_track.delete( { 'access_time': {$lte: XXX} })

请建议。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    你可以给任何带有 Javascript 日期的日期

    db.user_track.remove( { access_time : {"$lt" : new Date(year, month_0_indexed, day)} })
    

    所以要在 2013 年 9 月 1 日之前删除文档,您的命令应该是

    db.user_track.remove( { access_time : {"$lt" : new Date(2013, 8, 1) } })
    

    9 月是第 9 个月,但月份字段的索引为零。所以我们把它设为 8。

    【讨论】:

    • 感谢您提及month_0_indexed。 :p
    【解决方案2】:

    Mongo 在集合上有一个 TTL 功能,我认为这是解决这种情况的一个很好的解决方案:

    https://docs.mongodb.com/manual/tutorial/expire-data/

    基本上是这样的:

    db.log_events.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 })

    【讨论】:

    • 你不知道你救了谁的命,谢谢。
    【解决方案3】:

    除了其他答案,您可能对“生存时间”收集功能感兴趣: http://docs.mongodb.org/manual/tutorial/expire-data/

    在特定时间段后自动从集合中过期/删除文档很有用。

    【讨论】:

      【解决方案4】:

      可能有更清洁的解决方案,但这应该可行:

      1. 从日期字符串创建新的数据字段:

        var cursor = db.user_track.find()
        while (cursor.hasNext()) {
            var doc = cursor.next();
            db.user_track.update(
                {_id : doc._id},
                {$set : {access_time_ : new    Date(doc.access_time)}})
        }
        
      2. 现在您可以通过比较日期来检索一些记录:

        db.user_track.find({access_time_: {$lt: new Date("Sep 01 2013 00:00:00 GMT+00:00")}})
        
      3. 如果一切正常,请删除过时的记录:

        db.user_track.remove({access_time_: {$lt: new Date("Sep 01 2013 00:00:00 GMT+00:00")}})
        
      4. 将来使用日期对象而不是字符串

      【讨论】:

      • 感谢您的更新,您的意思是我需要为每个日期手动执行删除吗??
      • 如果我理解正确的话,我不是。 {access_time_: {$lt: new Date('Sep 1, 2013')} 应该匹配所有带有 access_time_ 在 'Sep 1, 2013' 之前的文档。因此,只要您不调用 remove 并将 justOne 设置为 True,它就会删除查询匹配的所有文档。
      • @zero323 您在 not 中以 UTC 格式在单引号中给出的日期。它取决于系统。
      • @bsd 感谢您的关注。已更新。
      【解决方案5】:

      我找到了解决这个问题的方法。

      var date=new Date();
      date.setDate(date.getDate() - 1);
      db.user_track.remove({"access_time":{"$lt":date}});
      

      我将通过将这些行放入 bash 文件并使用 cron 选项卡安排该脚本来自动运行。

      如果这是一个有效的解决方案,请分享您的观点??

      【讨论】:

      • getDate 返回月份中的某天。那是你要找的吗?查看我的解决方案。
      • @bsd 我已经在我的开发环境中尝试过这个并且工作正常。
      • 也许它有效,因为您没有上个月的日期。尝试插入更多日期。我认为这行不通。它只是从昨天开始删除文档。您可以通过再次输入变量date 来签入 mongo shell。
      猜你喜欢
      • 2012-08-04
      • 1970-01-01
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多