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