我正在尝试删除我的收藏中的旧记录。
我有一个名为" 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} })
请建议。
答案 0 :(得分:23)
您可以使用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。
答案 1 :(得分:4)
可能有更清洁的解决方案,但这应该有效:
从日期字符串创建新的数据字段:
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)}})
}
现在您可以通过比较日期来检索一些记录:
db.user_track.find({access_time_: {$lt: new Date("Sep 01 2013 00:00:00 GMT+00:00")}})
如果一切按预期工作,请删除过时的记录:
db.user_track.remove({access_time_: {$lt: new Date("Sep 01 2013 00:00:00 GMT+00:00")}})
将来使用日期对象而不是字符串
答案 2 :(得分:3)
除了其他答案,您可能会对“生存时间”收集功能感兴趣: http://docs.mongodb.org/manual/tutorial/expire-data/
在特定时间段后自动过期/删除集合中的文档非常有用。
答案 3 :(得分:2)
Mongo在集合上有一个TTL功能,我认为这是一个很好的解决方案:
https://docs.mongodb.com/manual/tutorial/expire-data/
基本上类似于:
db.log_events.createIndex({" createdAt":1},{expireAfterSeconds: 3600})
答案 4 :(得分:0)
我找到了解决此问题的解决方案。
var date=new Date();
date.setDate(date.getDate() - 1);
db.user_track.remove({"access_time":{"$lt":date}});
我将通过将这些行放在bash文件中并使用cron选项卡安排该脚本来自动运行。
如果这是一个有效的解决方案,请分享您的观点吗?