MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment trouver toutes les plages de dates chevauchant une autre plage de dates dans MongoDB ?

Je crois que vous essayez de trouver des documents avec des plages de dates qui se chevauchent. Autrement dit tout document dont le start ou end les dates se situent entre la plage de dates donnée.

Vous pouvez certainement y parvenir avec un peu de correspondance et de logique.

Supposons que j'ai deux documents dans ma collection

{ 
    "_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"
}

Lorsque j'exécute le morceau de code suivant

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());

je reçois

[
    {
        "_id" : ObjectId("56f6928c0c96eddb0a2c287f"), 
        "start" : "2015-03-27T16:00:00.000Z", 
        "end" : "2015-03-27T27:00:00.000Z"
    }
]

Qui est un document qui se chevauche pour une plage de dates donnée. J'espère que tout a du sens. Pour de meilleures performances, je recommanderai d'avoir un index sur start et end champs.