MongoDB / Mongoose interroger à une date spécifique?

Est-il possible de demander une date spécifique?

J’ai trouvé dans le mongo Cookbook que nous pouvons le faire pour une plage Interrogation pour une plage de dates comme celle-ci:

db.posts.find({"created_on": {"$gte": start, "$lt": end}}) 

Mais est-ce possible pour une date précise? Cela ne fonctionne pas:

 db.posts.find({"created_on": new Date(2012, 7, 14) }) 

Cela devrait fonctionner si les dates que vous avez enregistrées dans la firebase database sont sans heure (juste l’année, le mois, le jour).

Il est probable que les dates que vous avez enregistrées étaient new Date() , ce qui inclut les composants de l’heure. Pour interroger ces moments, vous devez créer une plage de dates qui inclut tous les moments d’une journée.

 db.posts.find( //query today up to tonight {"created_on": {"$gte": new Date(2012, 7, 14), "$lt": new Date(2012, 7, 15)}}) 

Pour ceux d’entre nous qui utilisent Moment.js

 var moment = require('moment') var today = moment().startOf('day') var tomorrow = moment(today).endOf('day') MyModel.find({ createdAt: { $gte: today.toDate(), $lt: tomorrow.toDate() } }) 

Important: tous les moments sont mutables !

tomorrow = today.add(1, 'days') ne fonctionne pas car il mute aussi today . Le moment(today) appel moment(today) résout ce problème en clonant implicitement today .

Oui, l’object Date complète la date et l’heure, donc la comparaison avec la simple valeur de date ne fonctionne pas.

Vous pouvez simplement utiliser l’opérateur $ where pour exprimer une condition plus complexe avec une expression booléenne Javascript 🙂

 db.posts.find({ '$where': 'this.created_on.toJSON().slice(0, 10) == "2012-07-14"' }) 

created_on est le champ datetime et le 2012-07-14 est la date spécifiée.

La date doit être exactement au format AAAA-MM-JJ .

Remarque: utilisez $where avec parcimonie, cela a des conséquences sur les performances.

As-tu essayé:

 db.posts.find({"created_on": {"$gte": new Date(2012, 7, 14), "$lt": new Date(2012, 7, 15)}}) 

Le problème que vous allez rencontrer est que les dates sont stockées sous forme d’horodatages dans Mongo. Donc, pour correspondre à une date, vous lui demandez de faire correspondre un horodatage. Dans votre cas, je pense que vous essayez de faire correspondre un jour (de 00h00 à 23h59 à une date précise). Si vos dates sont stockées sans délais, vous devriez vous en sortir. Sinon, essayez de spécifier votre date comme une plage de temps le même jour (par exemple, start = 00: 00, fin = 23: 59) si gte ne fonctionne pas.

question similaire

Vous pouvez utiliser l’approche suivante pour la méthode API pour obtenir les résultats d’un jour spécifique:

 # [HTTP GET] getMeals: (req, res) -> options = {} # eg. api/v1/meals?date=Tue+Jan+13+2015+00%3A00%3A00+GMT%2B0100+(CET) if req.query.date? date = new Date req.query.date date.setHours 0, 0, 0, 0 endDate = new Date date endDate.setHours 23, 59, 59, 59 options.date = $lt: endDate $gte: date Meal.find options, (err, meals) -> if err or not meals handleError err, meals, res else res.json createJSON meals, null, 'meals' 

Nous avions un problème concernant les données dupliquées dans notre firebase database, avec un champ de date ayant plusieurs valeurs où nous devions avoir 1. Je pensais append la façon dont nous avons résolu le problème pour référence.

Nous avons une collection appelée “data” avec un champ “value” numérique et un champ “date” de date. Nous avons eu un processus que nous pensions être idempotent, mais nous avons fini par append 2 valeurs par jour lors de la deuxième exécution:

 { "_id" : "1", "type":"x", "value":1.23, date : ISODate("2013-05-21T08:00:00Z")} { "_id" : "2", "type":"x", "value":1.23, date : ISODate("2013-05-21T17:00:00Z")} 

Nous n’avons besoin que de 1 des 2 enregistrements, nous avons donc dû utiliser le javascript pour nettoyer la firebase database. Notre approche initiale allait être de parcourir les résultats et de supprimer tous les champs entre 6h et 11h (tous les doublons étaient le matin), mais pendant la mise en œuvre, nous avons apporté des modifications. Voici le script utilisé pour le corriger:

 var data = db.data.find({"type" : "x"}) var found = []; while (data.hasNext()){ var datum = data.next(); var rdate = datum.date; // instead of the next set of conditions, we could have just used rdate.getHour() and checked if it was in the morning, but this approach was slightly better... if (typeof found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()] !== "undefined") { if (datum.value != found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()]) { print("DISCREPENCY!!!: " + datum._id + " for date " + datum.date); } else { print("Removing " + datum._id); db.data.remove({ "_id": datum._id}); } } else { found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()] = datum.value; } } 

et puis l’a exécuté avec mongo thedatabase fixer_script.js