MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB trouve la plage de dates en cas de chevauchement avec d'autres dates

Le chevauchement temporel peut être illustré par ces 4 cas dans la figure ci-dessous, où S/E est la date de début/date de fin du nouveau document et S'/E' est la date de début/date de fin de tout document existant :

  S'                  E' 
  |-------------------|

   S                E 
   |****************|

S'          E' 
|-----------|

      S'          E' 
      |-----------|

              S'          E' 
              |-----------|

Dans 4 cas on a S'<E et E'>S . La requête pour trouver tous les documents dont le temps se chevauche peut être :

db.collection.find({"startdate": {"$lt": E}, "enddate": {"$gt": S}})

MODIFIER :

Votre date de début et votre date de fin sont au format chaîne et ne sont pas ordonnées lexicalement, vous ne pouvez donc pas utiliser "$gt" et "$lt" à des fins de comparaison. Vous devez les convertir en type Date :

db.collection.find().forEach(
  function (e) {
    // convert date if it is a string
    if (typeof e.startdate === 'string') {
       e.startdate = new Date(e.startdate);
    }
    if (typeof e.enddate === 'string') {
       e.enddate = new Date(e.enddate);
    } 
    // save the updated document
    db.collection.save(e);
  }
)

La requête finale sera :

db.collection.find({"startdate": {"$lt": new Date("E")}, "enddate": {"$gt": new Date("S")}})