sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB hittar datumintervall om överlappning med andra datum

Tidsöverlappningen kan illustreras med dessa 4 fall i figuren nedan, där S/E är startdatum/slutdatum för det nya dokumentet och S'/E' är startdatum/slutdatum för alla befintliga dokument:

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

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

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

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

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

I 4 fall har vi S'<E och E'>S . Frågan för att hitta alla dokument med överlappande tid kan vara:

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

EDIT:

Ditt startdatum och slutdatum är i strängformat och inte ordnade lexikalt, därför kan du inte använda "$gt" och "$lt" för jämförelse. Du bör konvertera dem till datumtyp:

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

Den sista frågan blir:

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



  1. MongoDB räknar objekt i array

  2. Vad är BSON och exakt hur skiljer det sig från JSON?

  3. Få det högsta värdet av en kolumn i MongoDB

  4. Mongodb sortera inre array