Удалить старые записи в 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)"
}

в моей коллекции user_track я хочу сохранить только данные текущего месяца (то есть с 01 сентября 2013 года по текущий день ) и хочу удалить остальные записи, которые не принадлежат текущему месяцу

Я попытался выполнить приведенную ниже команду, но я не уверен, как чтобы выдать эту команду в соответствии с моим требованием, поскольку дата у меня есть в другом формате .

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

пожалуйста, предложите .

5 ответов


вы можете дать любую дату с датой Javascript

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

поэтому для удаления документов до 1 сентября 2013 ваша команда должна быть

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

сентябрь-это 9-й месяц, но поле месяца имеет нулевой индекс. Поэтому мы делаем это как 8.


вероятно, есть более чистое решение, но это должно работать:

  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. в будущем используйте объекты даты не строки


в дополнение к другим ответам вы можете быть интересны в функции коллекции " Время жить: http://docs.mongodb.org/manual/tutorial/expire-data/

полезно автоматически истекать / удалять документы из коллекции после определенного периода времени.


Я нашел решение для решения этой проблемы .

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

Я сделаю это автоматически, поместив эти строки в файл bash и запланировав этот скрипт с помощью вкладки cron .

пожалуйста, поделитесь своими мнениями, если это допустимое решение или нет ??


У Mongo есть функция TTL в коллекциях, я думаю, что это хорошее решение для таких случаев:

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

в основном что-то вроде:

db.журнал событий.createIndex ({"createdAt": 1 }, { expireAfterSeconds: 3600 } )