retourne la requête en fonction de la date


210

J'ai des données comme ça 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??}), afin qu'il me renvoie le résultat des données ci-dessus à partir de la base de données?


il aurait été efficace de mentionner la bibliothèque nodejs que vous utilisiez, mais sur la base de l'exemple, il semble que ce soit ses
mongoosejs

Réponses:


422

Vous souhaitez probablement effectuer une requête de 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 cela est souvent utilisé pour les requêtes de date uniquement, où le composant d'heure est 00:00:00.

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

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

14
Ahh :) Je pensais que vous utilisiez la console Mongo. Il ISODatey a un wrapper pour l'objet js Date. Essayez quelque chose comme "createdAt" : new Date("2010-01-01"). Pour une raison quelconque, ce code ne fonctionne cependant pas (pour la version 2.0.2) dans la console Mongo.
mnemosyn

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

16

si vous voulez obtenir des articles n'importe où à cette date, vous devez comparer deux dates

Vous pouvez créer deux dates à partir de la première comme celle-ci, 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)

16

Je viens d'implémenter quelque chose de similaire dans Mongo v3.2.3 en utilisant Node v0.12.7 et v4.4.4 et j'ai utilisé:

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

Je passe un ISODate (par exemple 2016-04-22T00: 00: 00Z) et cela fonctionne pour une requête .find () avec ou sans la fonction toISOString. Mais lors de l'utilisation dans une requête .aggregate () $ match, il n'aime pas la fonction toISOString!


12

Si vous voulez obtenir toutes les nouvelles choses au cours des 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 souhaitez faire correspondre (incluez la direction de tri -1 pour décroissant et 1 pour croissant)

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

Recherchez ensuite les documents créés au cours des 5 dernières minutes (60 secondes * 5 minutes) .... car le javascript .getTime()renvoie des millisecondes dont vous devez multiplier par 1000 avant de l'utiliser comme entrée pour le 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 la suivante:

On calcule 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 cela: 5*60*1000- Je multiplie juste par 60secondes donc c'est facile à changer. Je peux changer 5de 120si je veux 2 heures (120 minutes).
  3. new Date().getTime()-60*5*1000nous donne 1484383878676(il y a 5 minutes en ms)

Maintenant, nous devons l'introduire dans un new Date()constructeur pour obtenir le format de chaîne ISO requis par les horodatages MongoDB.

  1. { $gte: new Date(resultFromAbove).toISOString() } (requête mongodb .find ())
  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 convertissez 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 les variables si vous utilisez le pilote natif de node-mongodb, mais cela fonctionne dans le shell mongo qui est ce que j'utilise habituellement pour vérifier les choses.


1
Je pense que vous pouvez utiliser à la Date.now()place denew Date().getTime()
Béranger

4

Vous pouvez également essayer:

{
    "dateProp": { $gt: new Date('06/15/2016').getTime() }
}

2

Si vous utilisez Mongoose,

try {
  const data = await GPSDatas.aggregate([
    {
      $match: { createdAt : { $gt: new Date() }
    },
    {
      $sort: { createdAt: 1 }
    }
  ])
  console.log(data)

} catch(error) {
    console.log(error)
}

1

Trouvez avec une date précise:

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

Trouvez avec plus gteou moins lt:

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

Rechercher par gamme:

db.getCollection('CollectionName').find({ 
    "DepartureDate": { 
        $lt: new Date(), 
        $gte: new Date(new Date().setDate(new Date().getDate()-15))
      } 
    })
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.