根据Month删除mongodb中的旧记录

Paw*_*wan 11 mongodb

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

我有一个名为"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)"
}
Run Code Online (Sandbox Code Playgroud)

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

我试图发出以下命令,但我不知道如何发出此命令以满足我的要求,因为我的日期是不同的格式.

db.user_track.delete( { 'access_time': {$lte: XXX} })
Run Code Online (Sandbox Code Playgroud)

请建议.

bsd*_*bsd 24

您可以使用Javascript日期提供任何日期

db.user_track.remove( { access_time : {"$lt" : new Date(year, month_0_indexed, day)} })
Run Code Online (Sandbox Code Playgroud)

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

db.user_track.remove( { access_time : {"$lt" : new Date(2013, 8, 1) } })
Run Code Online (Sandbox Code Playgroud)

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


JAR*_*ans 6

Mongo 在集合上有一个 TTL 特性,我认为这是一个很好的解决方案:

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

基本上是这样的:

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


zer*_*323 5

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

  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)}})
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 现在您可以通过比较日期来检索一些记录:

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

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

  • 如果我理解正确的话,我不是。{access_time_: {$lt: new Date('Sep 1, 2013')} 应该匹配所有在 'Sep 1, 2013' 之前带有 access_time_ 的文档。因此,只要您不将 justOne 设置为 True 时调用 remove ,它就会删除与查询匹配的所有文档。 (2认同)

Kam*_*rey 5

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

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