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

MongoDB $dateFromParts

V MongoDB, $dateFromParts Operátor agregačního kanálu vytvoří a vrátí objekt Date z jednotlivých částí data.

Každou část data poskytujete jako samostatné pole.

V případě potřeby můžete zadat pole pro datum ve formátu ISO týdne.

Příklad

Předpokládejme, že máme kolekci nazvanou dateParts s následujícím dokumentem:

{
	"_id" : 1,
	"year" : 2020,
	"month" : 12,
	"day" : 31,
	"hour" : 23,
	"minute" : 30,
	"second" : 25,
	"millisecond" : 123
}

Dokument obsahuje pro každou část data jiné pole.

Můžeme spustit následující kód a vrátit objekt data z polí v těchto dokumentech.

db.dateParts.aggregate([
{
   $project: {
      date: {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond"
         }
      }
   }
}])

Výsledek:

{ "_id" : 1, "date" : ISODate("2020-12-31T23:30:25.123Z") }

Všechny části data/času byly převedeny na jeden objekt data.

Časová pásma

Můžete použít timezone pole pro zadání časového pásma.

Časové pásmo lze zadat buď pomocí identifikátoru časového pásma Olson (např. "Europe/London" , "GMT" ) nebo offset UTC (např. "+02:30" , "-1030" ).

Olsonův identifikátor časového pásma

Zde je příklad, který používá Olson ID časového pásma k výstupu tří různých dat z jednoho dokumentu na základě tří různých časových pásem.

db.dateParts.aggregate([
{
   $project: {
      dateUTC: {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "Pacific/Auckland"
         }
      },
      dateHonolulu: {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "Pacific/Honolulu"
         }
      },
      dateAuckland: {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "Pacific/Auckland"
         }
      }
   }
}]).pretty()

Výsledek:

{
	"_id" : 1,
	"dateUTC" : ISODate("2020-12-31T10:30:25.123Z"),
	"dateHonolulu" : ISODate("2021-01-01T09:30:25.123Z"),
	"dateAuckland" : ISODate("2020-12-31T10:30:25.123Z")
}

Posun UTC

Zde je příklad, který používá offset UTC.

db.dateParts.aggregate([
{
   $project: {
      "date+00:00": {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "+00:00"
         }
      },
      "date-10:00": {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "-10:00"
         }
      },
      "date+12:00": {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "+12:00"
         }
      }
   }
}]).pretty()

Výsledek:

{
	"_id" : 1,
	"date+00:00" : ISODate("2020-12-31T23:30:25.123Z"),
	"date-10:00" : ISODate("2021-01-01T09:30:25.123Z"),
	"date+12:00" : ISODate("2020-12-31T11:30:25.123Z")
}

Formát data týdne podle ISO

Části data lze v případě potřeby specifikovat pomocí formátu ISO 8601.

Konkrétně můžete použít:

Specifikátor formátu Výstup
isoWeekYear Rok ve formátu ISO 8601. Toto pole je povinné, pokud nepoužíváte year (a year je vyžadováno, pokud nepoužíváte isoWeekYear ).
isoWeek Týden v roce ve formátu ISO 8601. Lze použít pouze s isoWeekYear .
isoDayOfWeek Den v týdnu (1–pondělí, 7–neděle). Lze použít pouze s isoWeekYear .

Předpokládejme, že vložíme druhý dokument, který vypadá takto:

{
	"_id" : 2,
	"isoWeekYear" : 2021,
	"isoWeek" : 32,
	"isoDayOfWeek" : 7,
	"hour" : 23,
	"minute" : 30,
	"second" : 25,
	"millisecond" : 123,
	"timezone" : "UTC"
}

Vidíme, že používá isoWeekYear , isoWeek a isoDayOfWeek místo year , month a day (což je to, co používá první dokument).

K vytvoření objektu Date z tohoto dokumentu můžeme použít následující kód:

db.dateParts.aggregate([
  { $match: { _id: 2} },
  {
    $project: {
        date: {
          $dateFromParts: {
              "isoWeekYear": "$isoWeekYear", 
              "isoWeek": "$isoWeek", 
              "isoDayOfWeek": "$isoDayOfWeek", 
              "hour": "$hour", 
              "minute": "$minute", 
              "second": "$second", 
              "millisecond": "$millisecond", 
              "timezone": "$timezone"
          }
        }
    }
  }
])

Výsledek:

{ "_id" : 2, "date" : ISODate("2021-08-15T23:30:25.123Z") } 

Pole mimo rozsah

Počínaje MongoDB 4.4, podporovaný rozsah hodnot pro year a isoWeekYear je 1-9999 . V předchozích verzích byla spodní hranice těchto hodnot 0 a podporovaný rozsah hodnot byl 0-9999 .

Počínaje MongoDB 4.0, pokud je hodnota určena pro jiná pole než year , isoWeekYear a timezone je mimo platný rozsah, $dateFromParts operátor přenese nebo odečte rozdíl od ostatních částí data pro výpočet data.

Hodnoty vyšší než rozsah

Předpokládejme, že do naší sbírky přidáme následující dokument:

{
	"_id" : 3,
	"year" : 2020,
	"month" : 14,
	"day" : 65,
	"hour" : 48,
	"minute" : 130,
	"second" : 625,
	"millisecond" : 123
}

Mnoho polí data a času v tomto dokumentu je vyšší než jejich příslušné platné rozsahy.

Spusťte následující příkaz, který jej převede na objekt Date:

db.dateParts.aggregate([
  { $match: { _id: 3} },
  {
    $project: {
        date: {
          $dateFromParts: {
              "year": "$year", 
              "month": "$month", 
              "day": "$day", 
              "hour": "$hour", 
              "minute": "$minute", 
              "second": "$second", 
              "millisecond": "$millisecond"
          }
        }
    }
  }
])

Výsledek:

{ "_id" : 3, "date" : ISODate("2021-04-08T02:20:25.123Z") }

Můžeme vidět, že části data ve výsledném objektu Date se liší od příslušných částí data v dokumentu. Důvodem je $dateFromParts přepočítal datum, aby zohlednil hodnoty části data, které přesáhly jejich normální rozsah.

Hodnoty nižší než rozsah

Předpokládejme, že do naší sbírky přidáme následující dokument:

{
	"_id" : 4,
	"year" : 2020,
	"month" : 0,
	"day" : 0,
	"hour" : 0,
	"minute" : 0,
	"second" : 0,
	"millisecond" : 0
}

Mnohá ​​pole data a času v tomto dokumentu jsou nižší než jejich příslušné platné rozsahy.

Spusťte následující příkaz, který jej převede na objekt Date:

db.dateParts.aggregate([
  { $match: { _id: 4} },
  {
    $project: {
        date: {
          $dateFromParts: {
              "year": "$year", 
              "month": "$month", 
              "day": "$day", 
              "hour": "$hour", 
              "minute": "$minute", 
              "second": "$second", 
              "millisecond": "$millisecond"
          }
        }
    }
  }
])

Výsledek:

{ "_id" : 4, "date" : ISODate("2019-11-30T00:00:00Z") }

  1. Jak se připojit k MySQL bez hesla root na terminálu

  2. Existuje alternativa Javy k Redis, kterou lze vložit?

  3. Jak používat transakci MongoDB pomocí Mongoose?

  4. MongoDB – více operací $or