MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB findet einen Datumsbereich, wenn er sich mit anderen Daten überschneidet

Die zeitliche Überschneidung kann mit diesen 4 Fällen in der folgenden Abbildung veranschaulicht werden, wobei S/E das Startdatum/Enddatum des neuen Dokuments und S'/E' das Startdatum/Enddatum eines beliebigen vorhandenen Dokuments ist:

  S'                  E' 
  |-------------------|

   S                E 
   |****************|

S'          E' 
|-----------|

      S'          E' 
      |-----------|

              S'          E' 
              |-----------|

In 4 Fällen haben wir S'<E und E'>S . Die Abfrage, um alle Dokumente mit sich überschneidender Zeit zu finden, kann wie folgt lauten:

db.collection.find({"startdate": {"$lt": E}, "enddate": {"$gt": S}})

BEARBEITEN:

Ihr Start- und Enddatum sind im Zeichenfolgenformat und nicht lexikalisch geordnet, daher können "$gt" und "$lt" nicht zum Vergleich verwendet werden. Sie sollten sie in den Datumstyp konvertieren:

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

Die letzte Abfrage lautet:

db.collection.find({"startdate": {"$lt": new Date("E")}, "enddate": {"$gt": new Date("S")}})