sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB encuentra el rango de fechas si se superpone con otras fechas

La superposición de tiempo se puede ilustrar con estos 4 casos en la figura a continuación, donde S/E es la fecha de inicio/finalización del nuevo documento y S'/E' es la fecha de inicio/finalización de cualquier documento existente:

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

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

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

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

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

En 4 casos tenemos S'<E y E'>S . La consulta para encontrar todos los documentos con tiempo superpuesto puede ser:

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

EDITAR:

Su fecha de inicio y fecha de finalización están en formato de cadena y no están ordenadas léxicamente, por lo tanto, no puede usar "$ gt" y "$ lt" para comparar. Debe convertirlos al tipo de fecha:

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 consulta final será:

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