Časové překrytí lze ilustrovat na těchto 4 případech na obrázku níže, kde S/E je počáteční/koncové datum nového dokumentu a S'/E' je počáteční/koncové datum jakéhokoli existujícího dokumentu:
S' E'
|-------------------|
S E
|****************|
S' E'
|-----------|
S' E'
|-----------|
S' E'
|-----------|
Ve 4 případech máme S'<E
a E'>S
. Dotaz k nalezení všech dokumentů s překrývajícím se časem může být:
db.collection.find({"startdate": {"$lt": E}, "enddate": {"$gt": S}})
EDIT:
Vaše počáteční a koncové datum jsou ve formátu řetězce a nejsou lexikálně uspořádané, proto nelze pro srovnání použít „$gt“ a „$lt“. Měli byste je převést na typ 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);
}
)
Poslední dotaz bude:
db.collection.find({"startdate": {"$lt": new Date("E")}, "enddate": {"$gt": new Date("S")}})