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