337 votes

retourner une requête basée sur la date

J'ai une donnée comme ceci dans mongodb

{ 
    "latitude" : "", 
    "longitude" : "", 
    "course" : "", 
    "battery" : "0", 
    "imei" : "0", 
    "altitude" : "F:3.82V", 
    "mcc" : "07", 
    "mnc" : "007B", 
    "lac" : "2A83", 
    "_id" : ObjectId("4f0eb2c406ab6a9d4d000003"), 
    "createdAt" : ISODate("2012-01-12T20:15:31Z") 
}

Comment puis-je interroger db.gpsdatas.find({'createdAt': ??what here??}) pour qu'il me renvoie le résultat des données ci-dessus à partir de la base de données ?

1 votes

Il aurait été efficace de mentionner quelle bibliothèque nodejs vous utilisez, mais d'après l'exemple, il semble que ce soit mongoosejs

607voto

mnemosyn Points 17378

Vous souhaitez probablement effectuer une requête par plage, par exemple, tous les éléments créés après une date donnée :

db.gpsdatas.find({"createdAt" : { $gte : new ISODate("2012-01-12T20:15:31Z") }});

J'utilise $gte (supérieur à ou égal à), car cette option est souvent utilisée pour les requêtes portant uniquement sur la date, où la composante temporelle est 00:00:00.

Si vous voulez vraiment trouver une date qui est égale à une autre date, la syntaxe serait la suivante

db.gpsdatas.find({"createdAt" : new ISODate("2012-01-12T20:15:31Z") });

14 votes

Ahh :) Je pensais que vous utilisiez la console Mongo. Voilà, ISODate est une enveloppe pour l'objet js Date. Essayez quelque chose comme "createdAt" : new Date("2010-01-01") . Pour une raison quelconque, ce code ne no fonctionne (pour la v. 2.0.2) dans la console Mongo, cependant.

0 votes

L'initialisation de la date utiliserait-elle des slashs au lieu de tirets ? comme ça : new Date("2010/01/01");

33voto

Paul Points 111

Je viens de mettre en œuvre quelque chose de similaire dans Mongo v3.2.3 en utilisant Node v0.12.7 et v4.4.4 :

{ $gte: new Date(dateVar).toISOString() }

Je passe une ISODate (par exemple 2016-04-22T00:00:00Z) et cela fonctionne pour une requête .find() avec ou sans la fonction toISOString. Mais lorsque je l'utilise dans une requête .aggregate() $match, la fonction toISOString ne fonctionne pas !

21voto

med116 Points 30

Si vous voulez obtenir des éléments à cette date, vous devez comparer deux dates.

Vous pouvez créer deux dates à partir de la première comme ceci, pour obtenir le début de la journée et la fin de la journée.

var startDate = new Date(); // this is the starting date that looks like ISODate("2014-10-03T04:00:00.188Z")

startDate.setSeconds(0);
startDate.setHours(0);
startDate.setMinutes(0);

var dateMidnight = new Date(startDate);
dateMidnight.setHours(23);
dateMidnight.setMinutes(59);
dateMidnight.setSeconds(59);

### MONGO QUERY

var query = {
        inserted_at: {
                    $gt:morning,
                    $lt:dateScrapedMidnight
        }
};

//MORNING: Sun Oct 12 2014 00:00:00 GMT-0400 (EDT)
//MIDNIGHT: Sun Oct 12 2014 23:59:59 GMT-0400 (EDT)

16voto

chovy Points 8012

Si vous voulez obtenir toutes les nouvelles choses dans les 5 dernières minutes, vous devrez faire quelques calculs, mais ce n'est pas difficile...

Créez d'abord un index sur la propriété sur laquelle vous voulez établir une correspondance (incluez la direction de tri -1 pour descendant et 1 pour ascendant).

db.things.createIndex({ createdAt: -1 }) // descending order on .createdAt

Ensuite, il faut rechercher les documents créés au cours des 5 dernières minutes (60 secondes * 5 minutes)....parce que le javascript est un outil de recherche de documents. .getTime() renvoie des millisecondes que vous devez multiplier par 1000 avant de l'utiliser comme entrée de la fonction new Date() constructeur.

db.things.find({
        createdAt: {
            $gte: new Date(new Date().getTime()-60*5*1000).toISOString()
         }
     })
     .count()

Explication pour new Date(new Date().getTime()-60*5*1000).toISOString() est le suivant :

Nous calculons d'abord "il y a 5 minutes" :

  1. new Date().getTime() nous donne l'heure actuelle en millisecondes
  2. Nous voulons soustraire 5 minutes (en ms) de ce chiffre : 5*60*1000 -- Je multiplie juste par 60 secondes pour que ce soit facile à changer. Je peux juste changer 5 a 120 si je veux 2 heures (120 minutes).
  3. new Date().getTime()-60*5*1000 nous donne 1484383878676 (Il y a 5 minutes dans ms)

Maintenant, nous devons alimenter cela dans un new Date() pour obtenir le format de chaîne ISO requis par les horodateurs MongoDB.

  1. { $gte: new Date(resultFromAbove).toISOString() } (mongodb .find() query)
  2. Comme nous ne pouvons pas avoir de variables, nous faisons tout en une seule fois : new Date(new Date().getTime()-60*5*1000)
  3. ...puis convertir en chaîne ISO : .toISOString()
  4. new Date(new Date().getTime()-60*5*1000).toISOString() nous donne 2017-01-14T08:53:17.586Z

Bien sûr, c'est un peu plus facile avec des variables si vous utilisez le pilote node-mongodb-native, mais cela fonctionne dans le shell mongo qui est ce que j'utilise habituellement pour vérifier les choses.

13voto

Trouver avec une date précise :

db.getCollection('CollectionName').find({"DepartureDate" : new ISODate("2019-06-21T00:00:00.000Z")})

Trouver avec plus gte ou peu lt :

db.getCollection('CollectionName').find({"DepartureDate" : { $gte : new ISODate("2019-06-11T00:00:00.000Z") }})

Recherche par gamme :

db.getCollection('CollectionName').find({ 
    "DepartureDate": { 
        $lt: new Date(), 
        $gte: new Date(new Date().setDate(new Date().getDate()-15))
      } 
    })

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X