Tidsoverlapningen kan illustreres med disse 4 tilfælde i figuren nedenfor, hvor S/E er startdato/slutdato for det nye dokument og S'/E' er startdato/slutdato for ethvert eksisterende dokument:
S' E'
|-------------------|
S E
|****************|
S' E'
|-----------|
S' E'
|-----------|
S' E'
|-----------|
I 4 tilfælde har vi S'<E
og E'>S
. Forespørgslen for at finde alle dokumenter med overlappende tid kan være:
db.collection.find({"startdate": {"$lt": E}, "enddate": {"$gt": S}})
EDIT:
Din startdato og slutdato er i strengformat og ikke leksikalsk ordnet, og kan derfor ikke bruge "$gt" og "$lt" til sammenligning. Du bør konvertere dem til datotype:
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);
}
)
Den endelige forespørgsel vil være:
db.collection.find({"startdate": {"$lt": new Date("E")}, "enddate": {"$gt": new Date("S")}})