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

8 způsobů, jak získat den z rande v MongoDB

Při extrakci dne z data bude přesná volba, kterou použijeme, záviset na tom, jak chceme, aby byl den reprezentován.

Chceme například den v týdnu, den v měsíci nebo den v roce? Nebo jej snad chceme ve formátu ISO 8601? Návratová hodnota se bude obvykle lišit podle toho, kterou zvolíme.

Tento článek zkoumá tyto možnosti, a proto představuje 8 způsobů, jak vrátit část dne z data v MongoDB.

Ukázková data

Předpokládejme, že máme sbírku nazvanou cats s následujícími dokumenty:

{ "_id" :1, "name" :"Scratch", "born" :ISODate("2021-01-03T23:30:15.123Z") }{ "_id" :2, "name" :" Mňau", "born" :ISODate("2019-12-08T04:00:12Z") }{ "_id" :3, "name" :"Fluffy", "born" :ISODate("2020-09-24T10:30:00 Z") }

Následující příklady ukazují různé možnosti pro vrácení části dne z born pole těchto dokumentů.

$dayOfWeek Operátor

Jak název napovídá, $dayOfWeek operátor vrátí den v týdnu z data.

Můžeme spustit následující kód a vrátit den v týdnu z born pole ve výše uvedeném dokumentu.

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthDayOfWeek: { $dayOfWeek: "$born" }
        }
    }
  ]
) 

Výsledek:

{ "birthDayOfWeek" :1 }{ "birthDayOfWeek" :1 }{ "birthDayOfWeek" :5 }

Při použití $dayOfWeek je také možné zadat časové pásmo operátor.

Viz MongoDB $dayOfWeek pro další informace a příklady.

$dayOfMonth Operátor

$dayOfMonth operátor vrátí den v měsíci z data.

Příklad:

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthDayOfMonth: { $dayOfMonth: "$born" }
        }
    }
  ]
) 

Výsledek:

{ "birthDayOfMonth" :3 }{ "birthDayOfMonth" :8 }{ "birthDayOfMonth" :24 }

Při použití $dayOfMonth můžete také určit časové pásmo operátor.

Viz MongoDB $dayOfMonth pro další informace a příklady.

$dayOfYear Operátor

Jo, uhodli jste. $dayOfYear operátor vrátí den v roce z data.

Příklad:

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthDayOfYear: { $dayOfYear: "$born" }
        }
    }
  ]
) 

Výsledek:

{ "birthDayOfYear" :3 }{ "birthDayOfYear" :342 }{ "birthDayOfYear" :268 }

$dayOfYear operátor také přijímá parametr časového pásma.

Viz MongoDB $dayOfYear pro další informace a příklady.

$dateToString Operátor

$dateToString operátor převede objekt data na řetězec podle uživatelem zadaného formátu. Uživatel tedy může určit, že se v případě potřeby vrátí pouze část dne.

Pro každou část data existují specifikátory formátu, a pokud jde o část dne, máte na výběr ze specifikátorů formátu, které budou záviset na tom, zda chcete vrátit den v týdnu, den v měsíci, den v roce nebo den v týdnu ve formátu ISO 8601.

Příklad:

db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          birthDayOfWeek: { $dateToString: { format: "%w", date: "$born" } },
          birthDayOfMonth: { $dateToString: { format: "%d", date: "$born" } },
          birthDayOfYear: { $dateToString: { format: "%j", date: "$born" } },
          birthDayOfWeekISO: { $dateToString: { format: "%u", date: "$born" } }
       }
     }
   ]
).pretty() 

Výsledek:

{ "birthDayOfWeek" :"1", "birthDayOfMonth" :"03", "birthDayOfYear" :"003", "birthDayOfWeekISO" :"7"}{ "birthDayOfWeek" :"1", "MthbirthDay":08", "birthDayOfYear" :"342", "birthDayOfWeekISO" :"7"}{ "birthDayOfWeek" :"5", "birthDayOfMonth" :"24", "birthDayOfYear" :"268", "narozeni:O "}

Mohli jsme poskytnout více specifikátorů formátu, abychom do výsledku zahrnuli další části data, ale protože nás v tomto článku zajímá pouze extrahování dne, použili jsme specifikátory formátu pouze pro vrácení části dne.

Viz MongoDB $dateToString pro další informace a příklady.

Viz také MongoDB $dateToString Specifikátory formátu pro seznam specifikátorů formátu, které můžete použít s $dateToString .

$dateToParts Operátor

$dateToParts operátor vrátí dokument, který obsahuje součásti dané hodnoty BSON Date jako jednotlivé vlastnosti. Vrácené vlastnosti jsou year , month , day , hour , minute , second a millisecond .

Můžeme tedy použít $dateToParts v jedné fázi potrubí a poté přidejte další fázi potrubí, která extrahuje day část v případě potřeby.

Zde je to, co $dateToParts vrací pro naše tři dokumenty:

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          dateParts: { $dateToParts: { date: "$born" } }
        }
    }
  ]
).pretty() 

Výsledek:

{ "dateParts" :{ "rok" :2021, "měsíc" :1, "den" :3, "hodina" :23, "minuta" :30, "sekunda" :15, "milisekunda" :123 }}{ "dateParts" :{ "rok" :2019, "měsíc" :12, "den" :8, "hodina" :4, "minuta" :0, "sekunda" :12, "milisekunda" :0 } }{ "dateParts" :{ "rok" :2020, "měsíc" :9, "den" :24, "hodina" :10, "minuta" :30, "sekunda" :0, "milisekunda" :0 }} 

Tato data lze předat do další fáze procesu, kde se extrahuje pouze day pole.

Co se stane, když přidáme další projekci pouze na day pole:

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          dateParts: { $dateToParts: { date: "$born" } }
        }
    },
    {
      $project:
        {
          birthDay: "$dateParts.day"
        }
    }
  ]
) 

Výsledek:

{ "birthDay" :3 }{ "birthDay" :8 }{ "birthDay" :24 }

To samozřejmě není tak stručné jako použití předchozích možností. V závislosti na tom, co ve svém kanálu děláte, však může být tento přístup možností.

Za zmínku také stojí, že $dateToParts přijímá iso8601 parametr, který upravuje výstupní dokument tak, aby používal pole data týdne podle ISO.

Viz MongoDB $dateToParts pro další informace a příklady.

The forEach() Metoda

Můžete použít cursor.forEach() iterovat kurzorem pomocí metody JavaScript k vrácení pouze hodnoty dne.

db.cats.find().forEach(
  function(c) {
    print(
      c.born.getDay()
      );
  }
); 

Výsledek:

104

V tomto případě používáme JavaScript getDay() metoda, která vrací celé číslo mezi 0 a 6, které odpovídá dni v týdnu pro dané datum podle místního času.

Další možností je použít getUTCDay() metoda, která využívá univerzální čas. Tuto metodu použijeme v dalším příkladu.

Případně jsme mohli použít JavaScript getDate() metoda, která vrací celé číslo mezi 1 a 31, které představuje den v měsíci pro dané datum.

Tato možnost také vrací pouze skutečnou hodnotu dne, nikoli celý dokument, jako v předchozích příkladech.

map() Metoda

cursor.map() metoda aplikuje funkci na každý dokument navštívený kurzorem a kombinuje hodnoty do pole.

Příklad:

db.cats.find().map(
  function(c) {
    c = c.born.getUTCDay();
    return c;
  }
); 

Výsledek:

[ 0, 0, 4 ]

Jak již bylo zmíněno, JavaScript getUTCDay() metoda vrací svůj výsledek pomocí univerzálního času. V tomto případě to vedlo k vrácení jiné hodnoty pro první dokument (dostali jsme 0 v tomto příkladu oproti 1 v předchozím).

$isoDayOfWeek Operátor

Pokud potřebujete vrátit den v týdnu ve formátu ISO 8601, můžete použít $isoDayOfWeek . Rok ISO 8601 začíná pondělím týdne 1 a končí nedělí posledního týdne.

Příklad:

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
        }
    }
  ]
) 

Výsledek:

{ "birthIsoDayOfWeek" :7 }{ "birthIsoDayOfWeek" :7 }{ "birthIsoDayOfWeek" :4 }

V tomto případě dostaneme úplně jiný výsledek, než jaký jsme dostali při použití $dayOfWeek operátora kvůli způsobu, jakým ISO 8601 vypočítává data.

Zde je příklad, který tento rozdíl demonstruje:

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthDayOfWeek: { $dayOfWeek: "$born" },
          birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
        }
    }
  ]
) 

Výsledek:

{ "birthDayOfWeek" :1, "birthIsoDayOfWeek" :7 }{ "birthDayOfWeek" :1, "birthIsoDayOfWeek" :7 }{ "birthDayOfWeek" :5, "birthIsoDayOfWeek":5, "birthIsoDayOfWeek":
  1. Redis sub/pub a php/nodejs

  2. MongoDB s Mongoidem v Rails - Geoprostorové indexování

  3. Jak vnořit seznam do struktury v Redis, abyste snížili nejvyšší úroveň?

  4. Klonování instance MongoDB nebo sady replik