MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB trova l'intervallo di date se si sovrappone ad altre date

La sovrapposizione temporale può essere illustrata con questi 4 casi nella figura seguente, dove S/E è data di inizio/data di fine del nuovo documento e S'/E' è data di inizio/data di fine di qualsiasi documento esistente:

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

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

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

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

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

In 4 casi abbiamo S'<E e E'>S . La query per trovare tutti i documenti con tempi sovrapposti può essere:

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

MODIFICA:

La data di inizio e la data di fine sono in formato stringa e non ordinate lessicalmente, quindi non è possibile utilizzare "$gt" e "$lt" per il confronto. Dovresti convertirli in tipo Data:

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 query finale sarà:

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