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.
@ 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. –
@ 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.) –
@ 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. –