删除mongodb中的旧记录

时间:2012-08-07 20:57:58

标签: mongodb database

我在Mongodb中有以下类型的记录。

{
    "_id" : ObjectId("50217d8874ebb0e4e52cc07d"),   
    "timestamp" : "8/7/12 1:41:36 PM Pacific Daylight Time",
    "_ts" : ISODate("2012-08-07T20:41:44.119Z")
}

如何删除旧记录?我尝试过像db.offlineLogs.remove({timestamp: {$lt:new Date("2012, 8, 3")}});这样的东西,但它不起作用。

3 个答案:

答案 0 :(得分:6)

使用此解决方法:db.offlineLogs.remove({"_ts":{"$lt":ISODate("2012-08-01T19:30:07.805Z")}});

答案 1 :(得分:3)

您也可以查看using TimeToLive

MongoDB具有一个功能TimeToLive,您可以在其中指定文档在自动删除之前需要多长时间才能存在于集合中。

例如,假设您有一个名为billing的集合,其中包含以下字段:

{ 
    "_id" : ObjectId("59a05ef17055161ef66e9b21"), 
    "receiptId" : NumberInt(31124124), 
    "salesperson" : "jack", 
    "salesTime" : ISODate("2017-08-25T17:32:23.157+0000")
}

您可以在此集合上创建索引,如:

db.billing.createIndex( { "salesTime": 1 }, { expireAfterSeconds: 3600 });

这将根据salesTime字段在一小时(3600秒)后删除集合中的任何文档。

答案 2 :(得分:1)

在原始查询中,timestamp只是一个字符串字段,Date()将被视为Mongo shell中的字符串。比较这些操作数将像任何其他字符串比较一样工作:

$ mongo
MongoDB shell version: 2.2.0-rc1-pre-
connecting to: test
> db.foo.drop()
true
> db.foo.insert({ x: Date() });
> db.foo.find()
{ "_id" : ObjectId("50218e808930273947a21cf3"), "x" : "Tue Aug 07 2012 17:54:09 GMT-0400 (EDT)" }
> sleep(1000)
null
> db.foo.find({ x: { $lt: Date() }});
{ "_id" : ObjectId("50218e808930273947a21cf3"), "x" : "Tue Aug 07 2012 17:54:09 GMT-0400 (EDT)" }
> db.foo.find({ x: { $gt: Date() }});
> 

ISODate()Mongo date fields的JS等效项,在使用$gt$lt运算符时,它与字符串值不具有可比性:

> db.foo.find({ x: { $gt: ISODate() }});
> db.foo.find({ x: { $lt: ISODate() }});
> db.foo.find({ x: { $ne: ISODate() }});
{ "_id" : ObjectId("50218e808930273947a21cf3"), "x" : "Tue Aug 07 2012 17:54:09 GMT-0400 (EDT)" }
> db.foo.insert({x: ISODate() });
> db.foo.find({ x: {$gt: Date() }});
> db.foo.find({ x: {$lt: Date() }});
{ "_id" : ObjectId("50218e808930273947a21cf3"), "x" : "Tue Aug 07 2012 17:54:09 GMT-0400 (EDT)" }
> db.foo.find({ x: {$ne: Date() }});
{ "_id" : ObjectId("50218e808930273947a21cf3"), "x" : "Tue Aug 07 2012 17:54:09 GMT-0400 (EDT)" }
{ "_id" : ObjectId("50218fa18930273947a21cf4"), "x" : ISODate("2012-08-07T21:58:57.350Z") }
>

Mongo确实定义了compare orders between types,其中字符串在日期之前,但是当相同的字段在整个集合中具有不同的类型时,它与排序顺序相关。

请注意,如果您想象自己经常做的事情(例如,在批处理过程中)删除旧记录,您可能会对TTL collections感兴趣,这是即将发布的2.2版本中的新功能。 Kristina Chodorow还在this blog entry中对这个主题写了一篇有趣的介绍。