2012-08-07 15 views
5

Ich habe Datensätze des folgenden Typs in Mongo DB.Entfernen Sie alte Datensätze in Mongo DB

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

Wie entferne ich alte Datensätze? Ich habe etwas wie db.offlineLogs.remove({timestamp: {$lt:new Date("2012, 8, 3")}}); versucht, aber es funktioniert nicht.

Antwort

1

In Ihrer ursprünglichen Abfrage ist timestamp einfach ein String-Feld und Date() wird als String in der Schale Mongo behandelt werden. Vergleicht man diese Operanden arbeiten wie jeder andere String-Vergleich:

$ 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() die JS-Äquivalent für Mongo date fields ist, und es ist nicht vergleichbar mit String-Werte, wenn die $gt oder $lt Operatoren:

> 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 definiert compare orders between types, in denen Zeichenfolgen vor Daten kommen, aber das bezieht sich auf Sortierreihenfolge, wenn dasselbe Feld verschiedene Typen über die Auflistung haben kann.

Beachten Sie, dass bei der Entfernung von alten Aufzeichnungen, wenn Sie sich oft vorstellen (z. B. in einem Batch-Prozess), TTL collections, die eine neue Funktion in der bevorstehenden Version 2.2 sind. Kristina Chodorow schrieb auch eine amüsante Einführung zum Thema in this blog entry.

6

es dieses Problem gelöst werden: db.offlineLogs.remove({"_ts":{"$lt":ISODate("2012-08-01T19:30:07.805Z")}});

3

Sie könnten auch auf using TimeToLive überprüfen.

MongoDB verfügt über eine Funktion TimeToLive, in der Sie angeben können, wie lange ein Dokument in einer Sammlung vorhanden sein soll, bevor es automatisch gelöscht wird.

Zum Beispiel nehme an, Sie haben eine Sammlung namens Abrechnung mit den folgenden Feldern:

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

Sie einen Index für diese Sammlung erstellen können wie:

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

Dieses jedes Dokument in das machen Sammlung wird nach einer Stunde (3600 Sekunden) basierend auf dem Feld SalesTime gelöscht.

+0

@ Fehler-SyntacticalRemorse: Während es schön ist, mehr Kontext zu haben, der [Canonical NAA Guide] (https://meta.stackexchange.com/questions/225370/your-answer-is-in-another-castle-when -is-eine-Antwort-nicht-eine-Antwort) kennzeichnet explizit nichts "NAA", wenn es den tatsächlichen Namen des Basiscode-Elements hat, das empfohlen wird. Kennzeichnen Sie diese Art von Antwort nicht in der Zukunft. –

+0

@ Fehler-SyntacticalRemorse: VLQ, dann? Bei der Bearbeitung habe ich den automatischen Downvote bemerkt. Aber VLQ ist noch weniger vertretbar. (Vermutungen über jemanden zu machen, der bei der Verwendung eines vordefinierten Autocomments flaggt, ist im Allgemeinen völlig in Ordnung.) –

+0

@ Error-SyntacticalRemorse: Nein, es war [Community ♦] (https://stackoverflow.com/users/-1/community), Dies führt automatisch zu einem Downvote, wenn ein VLQ/NAA-Flag über Bearbeiten umstritten ist. –