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")}})