2012-08-07 19 views
5

Ho registrazioni del seguente tipo in Mongo DB.Rimuovere vecchi record in mongodb

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

Come rimuovere i vecchi record? Ho provato qualcosa come db.offlineLogs.remove({timestamp: {$lt:new Date("2012, 8, 3")}});, ma non funziona.

risposta

1

Nella tua query originale, timestamp è semplicemente un campo di stringa e Date() saranno trattati come una stringa nella shell Mongo. Confrontando questi operandi funziona come ogni altro confronto stringhe:

$ 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() è l'equivalente JS per Mongo date fields, e non è comparabile con i valori di stringa quando si utilizzano i $gt o $lt operatori:

> 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 definisce compare orders between types, in cui le stringhe arrivano prima delle date, ma che si riferisce all'ordinamento quando lo stesso campo può avere tipi diversi nella collezione.

Si noti che se si rimuovono vecchi record in caso di qualcosa che si prevede di fare spesso (ad esempio in un processo batch), potrebbe essere interessato a TTL collections, che sono una nuova funzionalità nella prossima versione 2.2. Kristina Chodorow ha anche scritto una divertente introduzione sull'argomento in this blog entry.

6

risolta utilizzando questo: db.offlineLogs.remove({"_ts":{"$lt":ISODate("2012-08-01T19:30:07.805Z")}});

3

È inoltre possibile verificare su using TimeToLive.

MongoDB ha una funzione TimeToLive in cui è possibile specificare per quanto tempo si desidera che un documento sia presente in una raccolta prima che venga automaticamente eliminato.

Ad esempio, si supponga di avere una collezione di nome di fatturazione con i seguenti campi:

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

È possibile creare un'indice su questa collezione come:

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

Questo renderà qualsiasi documento nel raccolta da cancellare dopo un'ora (3600 secondi) in base al campo vendite.

+0

@ Error-SyntacticalRemorse: Mentre è bello avere più contesto, la [guida canonical NAA] (https://meta.stackexchange.com/questions/225370/your-answer-is-in-another-castle-when -è-una-risposta-non-una-risposta) esplicitamente non etichetta nulla "NAA" se ha il nome effettivo dell'elemento di codice di base raccomandato. Non contrassegnare questo tipo di risposta in futuro. –

+0

@ Error-SyntacticalRemorse: VLQ, quindi? Ho notato il downvote automatizzato quando ho modificato. Ma VLQ è ancora meno giustificabile. (Fare ipotesi su qualcuno che segnala quando si usa un autocomment in scatola è un comportamento perfettamente ragionevole in generale.) –

+0

@ Error-SyntacticalRemorse: No, era [Comunità ♦] (https://stackoverflow.com/users/-1/community), che emette automaticamente un downvote quando un flag VLQ/NAA viene contestato tramite modifica. –

Problemi correlati