sql >> Database >  >> NoSQL >> MongoDB

MongoDB vind datumbereik indien overlap met andere datums

De tijdoverlap kan worden geïllustreerd met deze 4 gevallen in de onderstaande afbeelding, waarbij S/E de startdatum/einddatum van het nieuwe document is en S'/E' de startdatum/einddatum is van een bestaand document:

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

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

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

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

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

In 4 gevallen hebben we S'<E en E'>S . De vraag om alle documenten met overlappende tijd te vinden kan zijn:

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

BEWERKEN:

Je startdatum en einddatum zijn in tekenreeksformaat en niet lexicaal geordend, daarom kunnen "$gt" en "$lt" niet worden gebruikt voor vergelijking. U moet ze converteren naar datumtype:

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

De laatste vraag zal zijn:

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



  1. Een ingesloten document bijwerken in mongoengine

  2. Ingesloten document bijwerken van Mongoose

  3. MongoDB gebruikt mijn index niet

  4. Werkt PHP 5.5 met MongoDB-stuurprogramma?