Le chevauchement temporel peut être illustré par ces 4 cas dans la figure ci-dessous, où S/E est la date de début/date de fin du nouveau document et S'/E' est la date de début/date de fin de tout document existant :
S' E'
|-------------------|
S E
|****************|
S' E'
|-----------|
S' E'
|-----------|
S' E'
|-----------|
Dans 4 cas on a S'<E
et E'>S
. La requête pour trouver tous les documents dont le temps se chevauche peut être :
db.collection.find({"startdate": {"$lt": E}, "enddate": {"$gt": S}})
MODIFIER :
Votre date de début et votre date de fin sont au format chaîne et ne sont pas ordonnées lexicalement, vous ne pouvez donc pas utiliser "$gt" et "$lt" à des fins de comparaison. Vous devez les convertir en type 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);
}
)
La requête finale sera :
db.collection.find({"startdate": {"$lt": new Date("E")}, "enddate": {"$gt": new Date("S")}})