web-dev-qa-db-fra.com

La requête de date avec ISODate dans Mongodb ne semble pas fonctionner

Il semble que je ne sois pas capable d’obtenir la requête de date la plus élémentaire pour fonctionner dans MongoDB. Avec un document qui ressemble à ceci:

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

Et une requête qui ressemble à ceci:

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

J'obtiens 0 résultats en exécutant:

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

Une idée pourquoi ça ne marche pas?

Pour référence, cette requête est générée par Spring's MongoTemplate , de sorte que je n’exerce aucun contrôle direct sur la requête qui est finalement envoyée à MongoDB.

(P.S.)

> db.version()
2.4.7

Merci!

163
Jason Polites

Bien que $date fasse partie de MongoDB Extended JSON , c'est ce que vous obtenez par défaut avec mongoexport je ne pense pas que vous puissiez vraiment l'utiliser dans le cadre de la requête.

Si vous essayez une recherche exacte avec $date comme ci-dessous:

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

vous aurez une erreur:

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

Essaye ça:

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

ou (à la suite des commentaires de @ user3805045 ):

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

ISODate peut également être nécessaire pour comparer les dates sans heure (noté par @ MattMolnar ).

Selon types de données dans le shell mongo les deux doivent être équivalents:

Le shell mongo fournit différentes méthodes pour renvoyer la date, sous forme de chaîne ou d'objet Date:

  • Méthode Date () qui renvoie la date actuelle sous forme de chaîne.
  • new Le constructeur Date () qui renvoie un objet Date à l’aide du wrapper ISODate ().
  • Constructeur ISODate () qui renvoie un objet Date à l'aide du wrapper ISODate ().

et en utilisant ISODatedevrait toujours renvoyer un objet Date .

{"$date": "ISO-8601 string"} peut être utilisé lorsqu'une représentation JSON stricte est requise. Un exemple possible est le connecteur Hadoop.

269
zero323

De la livre de recettes MongoDB commentaires de page:

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

Cela a fonctionné pour moi. En contexte complet, la commande suivante extrait tous les enregistrements pour lesquels le champ de date dt a une date du 2013-10-01 (AAAA-MM-JJ) Zulu:

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

Essaye ça:

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

En mode json strict, vous devrez garder la commande:

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

La seule chose qui a fonctionné pour définir mes requêtes de recherche sur mlab.com.

5
3vangelos

J'utilise robomongo en tant qu'interface client mongodb et les informations ci-dessous ont fonctionné pour moi

db.collectionName.find({"columnWithDateTime" : {
$lt:new ISODate("2016-02-28T00:00:00.000Z")}})

Du côté de l'application, j'utilise un pilote basé sur nodejs, mongodb (v1.4.3), l'application utilise datepicker dans l'interface utilisateur, ce qui donne une date telle que YYYY-mm-jj. Elle est ensuite ajoutée avec l'heure par défaut telle que 00:00:00, puis au constructeur new Date() puis fourni à l'objet de critères mongodb, je pense que le pilote convertit la date en date ISO et que la requête fonctionne alors et donne le résultat souhaité, mais le même constructeur new Date() ne fonctionne pas ou montrer la même sortie sur robo mongo, pour les mêmes critères, ce qui est étrange, car j’ai utilisé robomongo pour vérifier mes objets critères.

Alors que le cli mongoshell par défaut fonctionne bien avec ISODate et new Date()

4
siddharthrc

Dans le shell MongoDB:

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

Dans mon code nodeJS (en utilisant Mongoose)

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

J'interroge ma collection d'événements de capteurs pour renvoyer des valeurs pour lesquelles le champ 'De' est supérieur à la date donnée

2
lewma

c'est mon document

"_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",

maintenant, je veux trouver chaque 27 date document.so j'ai utilisé cela ....

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

result:1

cela a fonctionné pour moi.

1
vipin sharma