Nakładanie się czasu można zilustrować w tych 4 przypadkach na poniższym rysunku, gdzie S/E to data początkowa/końcowa nowego dokumentu, a S'/E' to data początkowa/końcowa dowolnego istniejącego dokumentu:
S' E'
|-------------------|
S E
|****************|
S' E'
|-----------|
S' E'
|-----------|
S' E'
|-----------|
W 4 przypadkach mamy S'<E
i E'>S
. Zapytanie o znalezienie wszystkich dokumentów z nakładającym się czasem może być:
db.collection.find({"startdate": {"$lt": E}, "enddate": {"$gt": S}})
EDYCJA:
Data rozpoczęcia i data zakończenia są w formacie ciągu i nie są uporządkowane leksykalnie, dlatego nie można użyć do porównania wartości „$gt” i „$lt”. Należy je przekonwertować na typ daty:
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);
}
)
Ostatnie zapytanie to:
db.collection.find({"startdate": {"$lt": new Date("E")}, "enddate": {"$gt": new Date("S")}})