2012-08-07 32 views
5

Tengo registros del siguiente tipo en Mongo DB.Eliminar registros antiguos en mongodb

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

¿Cómo elimino los registros antiguos? He intentado algo como db.offlineLogs.remove({timestamp: {$lt:new Date("2012, 8, 3")}});, pero no funciona.

Respuesta

1

En su búsqueda original, timestamp es simplemente un campo de cadena y Date() será tratado como una cadena en la consola mongo. Comparando los operandos funcionará como cualquier otra comparación de cadenas:

$ 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() es el equivalente JS para Mongo date fields, y no es comparable con los valores de cadena cuando se utilizan las $gt o $lt operadores:

> 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 define compare orders between types, en el que las cadenas vienen antes de las fechas, pero se relaciona con el orden de clasificación cuando el mismo campo puede tener diferentes tipos en la colección.

Tenga en cuenta que si la eliminación de registros antiguos es algo que se imagina haciendo a menudo (por ejemplo, en un proceso por lotes), puede interesarle TTL collections, que es una característica nueva en la próxima versión 2.2. Kristina Chodorow también escribió una introducción divertida sobre el tema en this blog entry.

6

Se resuelve que el uso de este: db.offlineLogs.remove({"_ts":{"$lt":ISODate("2012-08-01T19:30:07.805Z")}});

3

También puede consultar using TimeToLive.

MongoDB tiene una función TimeToLive donde puede especificar cuánto tiempo desea que un documento esté presente en una colección antes de que se elimine automáticamente.

Por ejemplo, suponga que tiene una colección denominada de facturación con los siguientes campos:

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

Se puede crear un índice en esta colección como:

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

Esto hará que cualquier documento en el colección que se eliminará después de una hora (3600 segundos) según el campo salesTime.

+0

@ Error-SyntacticalRemorse: Si bien es bueno tener más contexto, la [guía de NAA canónica] (https://meta.stackexchange.com/questions/225370/your-answer-is-in-another-castle-when -is-a-answer-not-a-answer) explícitamente no etiqueta nada "NAA" si tiene el nombre real del elemento de código básico que se recomienda. No marques este tipo de respuesta en el futuro. –

+0

@ Error-SyntacticalRemorse: VLQ, entonces? Noté el downvote automatizado cuando edité. Pero VLQ es aún menos justificable. (Hacer suposiciones sobre alguien que está marcando cuando usa una autocomment enlatada es un comportamiento perfectamente razonable en general.) –

+0

@ Error-SyntacticalRemorse: No, era [Community ♦] (https://stackoverflow.com/users/-1/community), que emite automáticamente un downvote cuando una bandera VLQ/NAA se disputa mediante edición. –

Cuestiones relacionadas