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!
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 ISODate
devrait 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.
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") }})
Essaye ça:
{ "dt" : { "$gte" : ISODate("2013-10-01") } }
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.
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()
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
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.