La sovrapposizione temporale può essere illustrata con questi 4 casi nella figura seguente, dove S/E è data di inizio/data di fine del nuovo documento e S'/E' è data di inizio/data di fine di qualsiasi documento esistente:
S' E'
|-------------------|
S E
|****************|
S' E'
|-----------|
S' E'
|-----------|
S' E'
|-----------|
In 4 casi abbiamo S'<E
e E'>S
. La query per trovare tutti i documenti con tempi sovrapposti può essere:
db.collection.find({"startdate": {"$lt": E}, "enddate": {"$gt": S}})
MODIFICA:
La data di inizio e la data di fine sono in formato stringa e non ordinate lessicalmente, quindi non è possibile utilizzare "$gt" e "$lt" per il confronto. Dovresti convertirli in tipo Data:
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 query finale sarà:
db.collection.find({"startdate": {"$lt": new Date("E")}, "enddate": {"$gt": new Date("S")}})