De tijdoverlap kan worden geïllustreerd met deze 4 gevallen in de onderstaande afbeelding, waarbij S/E de startdatum/einddatum van het nieuwe document is en S'/E' de startdatum/einddatum is van een bestaand document:
S' E'
|-------------------|
S E
|****************|
S' E'
|-----------|
S' E'
|-----------|
S' E'
|-----------|
In 4 gevallen hebben we S'<E
en E'>S
. De vraag om alle documenten met overlappende tijd te vinden kan zijn:
db.collection.find({"startdate": {"$lt": E}, "enddate": {"$gt": S}})
BEWERKEN:
Je startdatum en einddatum zijn in tekenreeksformaat en niet lexicaal geordend, daarom kunnen "$gt" en "$lt" niet worden gebruikt voor vergelijking. U moet ze converteren naar datumtype:
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);
}
)
De laatste vraag zal zijn:
db.collection.find({"startdate": {"$lt": new Date("E")}, "enddate": {"$gt": new Date("S")}})