web-dev-qa-db-fra.com

renvoyer la requête en fonction de la date

J'ai une donnée comme celle-ci chez 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 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?

170
coure2011

Vous voulez probablement faire 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 il est souvent utilisé pour les requêtes de type date uniquement, où le composant heure est 00:00:00.

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

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

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

Vous pouvez créer deux dates sur la première comme celle-ci, pour obtenir le début 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)
15
med116

Je viens juste de mettre en œuvre quelque chose de similaire dans Mongo v3.2.3 en utilisant Node v0.12.7 et v4.4.4 et 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 d'une requête .aggregate () $ match, il n'aime pas la fonction toISOString!

13
Paul

Si vous voulez avoir toutes les nouvelles choses au cours des 5 dernières minutes, vous devrez faire des calculs, mais ce n'est pas difficile ...

Commencez par créer un index sur la propriété que vous souhaitez associer (indiquez le sens du tri -1 pour décroissant et 1 pour croissant)

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

Interrogez ensuite les documents créés au cours des 5 dernières minutes (60 secondes * 5 minutes) .... car la fonction .getTime() de javascript renvoie des millisecondes dont vous avez besoin de plusieurs milliers avant de l'utiliser comme entrée du constructeur new Date().

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

L'explication de new Date(new Date().getTime()-60*5*1000).toISOString() est la suivante:

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

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

Nous devons maintenant alimenter cela dans un constructeur new Date() 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 un: new Date(new Date().getTime()-60*5*1000)
  3. ... puis convertis 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, cela est un peu plus facile avec les variables si vous utilisez le pilote node-mongodb-native, mais cela fonctionne dans le shell mongo, ce que j’utilise habituellement pour vérifier certaines choses.

10
chovy

Vous pouvez aussi essayer:

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

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)
}
2
Atul Yadav

Trouver avec une date spécifique:

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

Trouver avec plus de gte ou peu 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))
      } 
    })
0
Hamit YILDIRIM