Wydaje mi się, że próbujesz znaleźć dokumenty z nakładającymi się zakresami dat. Innymi słowy każdy dokument, którego start
lub end
daty mieszczą się w podanym zakresie dat.
Z pewnością możesz to osiągnąć przy odrobinie dopasowania i logiki.
Załóżmy, że mam w swojej kolekcji dwa dokumenty
{
"_id" : ObjectId("56f692730c96eddb0a2c287e"),
"start" : "2015-03-27T15:00:00.000Z",
"end" : "2015-03-27T17:00:00.000Z"
}
{
"_id" : ObjectId("56f6928c0c96eddb0a2c287f"),
"start" : "2015-03-27T16:00:00.000Z",
"end" : "2015-03-27T27:00:00.000Z"
}
Kiedy wykonuję następujący fragment kodu
var startDate = "2015-03-27T20:00:00.000Z";
var endDate = "2015-03-27T21:00:00.000Z";
var findOverlapingDates = function(startDate, endDate){
return db.collection.find({
$or: [
{$and: [
{start:{$gte: startDate}}, {start:{$lte: endDate}}
]},
{start:{$lte: startDate}, end:{$gte: startDate}}
]
});
};
printjson(findOverlapingDates(startDate, endDate).toArray());
dostaję
[
{
"_id" : ObjectId("56f6928c0c96eddb0a2c287f"),
"start" : "2015-03-27T16:00:00.000Z",
"end" : "2015-03-27T27:00:00.000Z"
}
]
Który dokument pokrywa się z podanym zakresem dat. Mam nadzieję, że to wszystko ma sens. Aby uzyskać najlepszą wydajność, polecam mieć indeks na obu start
i end
pola.