MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB encontra intervalo de datas se se sobrepuser a outras datas


A sobreposição de tempo pode ser ilustrada com estes 4 casos na figura abaixo, onde S/E é a data de início/fim do novo documento e S'/E' é a data de início/fim de qualquer documento existente:
  S'                  E' 
  |-------------------|

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

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

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

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

Em 4 casos temos S'<E e E'>S . A consulta para encontrar todos os documentos com tempo sobreposto pode ser:
db.collection.find({"startdate": {"$lt": E}, "enddate": {"$gt": S}})

EDITAR:

Sua data de início e data de término estão em formato de string e não ordenadas lexicalmente, portanto, não é possível usar "$gt" e "$lt" para comparação. Você deve convertê-los para o tipo 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);
  }
)

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