sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB najde časové období, pokud se překrývá s jinými daty

Časové překrytí lze ilustrovat na těchto 4 případech na obrázku níže, kde S/E je počáteční/koncové datum nového dokumentu a S'/E' je počáteční/koncové datum jakéhokoli existujícího dokumentu:

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

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

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

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

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

Ve 4 případech máme S'<E a E'>S . Dotaz k nalezení všech dokumentů s překrývajícím se časem může být:

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

EDIT:

Vaše počáteční a koncové datum jsou ve formátu řetězce a nejsou lexikálně uspořádané, proto nelze pro srovnání použít „$gt“ a „$lt“. Měli byste je převést na typ Date:

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

Poslední dotaz bude:

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



  1. mongo + cestující:správný způsob, jak se znovu připojit k databázi zevnitř kolejí? jak zajistit optimální výkon mongo?

  2. Vytvořte strom uzlů pomocí rekurzivní tabulky pomocí Express a Mongo

  3. Jak najít dokument podle částí ObjectId?

  4. Ovladač MongoDB Java:odlišný od řazení