it-swarm.com.de

Datumsabfrage mit ISODate in Mongodb scheint nicht zu funktionieren

Es scheint mir nicht möglich zu sein, auch nur die grundlegendste Datumsabfrage in MongoDB zum Laufen zu bringen. Mit einem Dokument, das ungefähr so ​​aussieht:

{
    "_id" : "foobar/201310",
    "ap" : "foobar",
    "dt" : ISODate("2013-10-01T00:00:00.000Z"),
    "tl" : 375439
}

Und eine Abfrage, die so aussieht:

{ 
    "dt" : { 
        "$gte" : { 
            "$date" : "2013-10-01T00:00:00.000Z"
        }
    }
}

Ich erhalte 0 Ergebnisse von der Ausführung von:

db.mycollection.find({
  "dt" : { "$gte" : { "$date" : "2013-10-01T00:00:00.000Z"}}
})

Irgendeine Idee, warum das nicht funktioniert?

Als Referenz wird diese Abfrage von Spring's MongoTemplate erstellt, sodass ich keine direkte Kontrolle über die Abfrage habe, die letztendlich an MongoDB gesendet wird.

(P.S.)

> db.version()
2.4.7

Vielen Dank!

163
Jason Polites

Obwohl $date ein Teil von MongoDB Extended JSON ist und das ist, was Sie standardmäßig mit mongoexport erhalten, glaube ich nicht kann es wirklich als Teil der Abfrage verwenden.

Wenn Sie die exakte Suche mit $date wie folgt versuchen:

db.foo.find({dt: {"$date": "2012-01-01T15:00:00.000Z"}})

du wirst eine Fehlermeldung bekommen:

error: { "$err" : "invalid operator: $date", "code" : 10068 }

Versuche dies:

db.mycollection.find({
    "dt" : {"$gte": new Date("2013-10-01T00:00:00.000Z")}
})

oder (folgende Kommentare von @ user3805045 ):

db.mycollection.find({
    "dt" : {"$gte": ISODate("2013-10-01T00:00:00.000Z")}
})

ISODate kann auch erforderlich sein, um Daten ohne Zeitangabe zu vergleichen (gekennzeichnet durch @ MattMolnar ).

Entsprechend den Datentypen in der Mongo-Shell sollten beide äquivalent sein:

Die Mongo-Shell bietet verschiedene Methoden zum Zurückgeben des Datums, entweder als Zeichenfolge oder als Date-Objekt:

  • Date () -Methode, die das aktuelle Datum als Zeichenfolge zurückgibt.
  • neuer Date () -Konstruktor, der ein Date-Objekt mithilfe des ISODate () -Hüllers zurückgibt.
  • ISODate () -Konstruktor, der ein Date-Objekt unter Verwendung des ISODate () -Hüllers zurückgibt.

und die Verwendung von ISODatesollte weiterhin ein Date-Objekt zurückgeben.

{"$date": "ISO-8601 string"} kann verwendet werden, wenn eine strikte JSON-Darstellung erforderlich ist. Ein mögliches Beispiel ist der Hadoop-Konnektor.

269
zero323

Aus dem MongoDB-Kochbuch Seitenkommentare:

"dt" : 
{
    "$gte" : ISODate("2014-07-02T00:00:00Z"), 
    "$lt" : ISODate("2014-07-03T00:00:00Z") 
}

Das hat bei mir funktioniert. Im vollständigen Kontext ruft der folgende Befehl jeden Datensatz ab, in dem das Datumsfeld dt ein Datum vom 01.10.2013 (JJJJ-MM-TT) hat. Zulu:

db.mycollection.find({ "dt" : { "$gte" : ISODate("2013-10-01T00:00:00Z"), "$lt" : ISODate("2013-10-02T00:00:00Z") }})
87
Steve HHH

Versuche dies:

{ "dt" : { "$gte" : ISODate("2013-10-01") } }
11
Jabba

Im strengen json-Modus müssen Sie die Reihenfolge einhalten:

{
    "dt": {
        "$gte": {
            "$date": "2013-10-01T00:00:00.000Z"
        }
    }
}

Das einzige, was funktioniert hat, um meine Suchanfragen auf mlab.com zu definieren.

5
3vangelos

In der MongoDB Shell:

db.getCollection('sensorevents').find({from:{$gt: new ISODate('2015-08-30 16:50:24.481Z')}})

In meinem NodeJS-Code (mit Mongoose)

    SensorEvent.Model.find( {
        from: { $gt: new Date( SensorEventListener.lastSeenSensorFrom ) }
    } )

Ich frage meine Sensorereignissammlung ab, um Werte zurückzugeben, bei denen das Feld "von" größer als das angegebene Datum ist

2
lewma

das ist mein Dokument

"_id" : ObjectId("590173023c488e9a48e903d6"),
    "updatedAt" : ISODate("2017-04-27T04:26:42.709Z"),
    "createdAt" : ISODate("2017-04-27T04:26:42.709Z"),
    "flightId" : "590170f97cb84116075e2680",

 "_id" : ObjectId("590173023c488e9a48e903d6"),
        "updatedAt" : ISODate("2017-04-28T03:26:42.609Z"),
        "createdAt" : ISODate("2017-04-28T03:26:42.609Z"),
        "flightId" : "590170f97cb84116075e2680",

jetzt möchte ich jedes 27. Date-Dokument finden. Also habe ich das benutzt ...

 > db.users.find({createdAt:{"$gte":ISODate("2017-04-27T00:00:00Z"),"$lt":ISODate("2017-04-28T00:00:00Z") }}).count()

result:1

das hat bei mir funktioniert.

1
vipin sharma