2012-08-07 111 views
5

我在Mongo DB中记录了以下类型的记录。删除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")}});,但它不起作用。

回答

1

在原始查询,timestamp是一个简单的字符串字段和Date()将被视为在蒙戈外壳的字符串。相比那些操作数会像其他任何字符串比较:

$ 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()是JS相当于为Mongo date fields,并且它使用$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") } 
> 

蒙戈的确定义了compare orders between types,其中字符串出现在日期之前,但是与同一字段在整个集合中可能具有不同类型时的排序顺序有关。

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

6

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

3

您可能还会检查using TimeToLive

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

例如,假设你有一个名为计费用下面的字段集合:

{ 
    "_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秒)删除集合。

+0

@ Error-SyntacticalRemorse:虽然有更多的上下文很好,但[NAA指南](https://meta.stackexchange.com/questions/225370/your-answer-is-in-another-castle-when如果它具有被推荐的基本代码元素的实际名称,则它明确地不标注任何“NAA”。今后不要标记这种类型的答案。 – 2017-08-25 00:07:47

+0

@ Error-SyntacticalRemorse:VLQ,那么?当我编辑时,我注意到了自动downvote。但VLQ更不合理。 (假设某人在使用自动装罐自动装箱时会出现标记,这是非常合理的行为。) – 2017-08-25 00:18:07

+0

@ Error-SyntacticalRemorse:不,它是[Community♦](https://stackoverflow.com/users/-1/community),当VLQ/NAA标记通过编辑发生争议时,会自动发出downvote。 – 2017-08-25 00:20:14