Die zeitliche Überschneidung kann mit diesen 4 Fällen in der folgenden Abbildung veranschaulicht werden, wobei S/E das Startdatum/Enddatum des neuen Dokuments und S'/E' das Startdatum/Enddatum eines beliebigen vorhandenen Dokuments ist:
S' E'
|-------------------|
S E
|****************|
S' E'
|-----------|
S' E'
|-----------|
S' E'
|-----------|
In 4 Fällen haben wir S'<E
und E'>S
. Die Abfrage, um alle Dokumente mit sich überschneidender Zeit zu finden, kann wie folgt lauten:
db.collection.find({"startdate": {"$lt": E}, "enddate": {"$gt": S}})
BEARBEITEN:
Ihr Start- und Enddatum sind im Zeichenfolgenformat und nicht lexikalisch geordnet, daher können "$gt" und "$lt" nicht zum Vergleich verwendet werden. Sie sollten sie in den Datumstyp konvertieren:
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);
}
)
Die letzte Abfrage lautet:
db.collection.find({"startdate": {"$lt": new Date("E")}, "enddate": {"$gt": new Date("S")}})