2012-08-07 147 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