sql >> Databasteknik >  >> NoSQL >> MongoDB

8 sätt att få dagen från en dejt i MongoDB

När du extraherar dagen från ett datum beror det exakta alternativet vi använder på hur vi vill att dagen ska representeras.

Vill vi till exempel ha veckodagen, månaden eller dagen på året? Eller kanske vi vill ha den i ISO 8601-format? Returvärdet kommer vanligtvis att vara olika beroende på vilken vi väljer.

Den här artikeln utforskar dessa alternativ och presenterar därför 8 sätt att returnera dagdelen från ett datum i MongoDB.

Exempeldata

Anta att vi har en samling som heter cats med följande dokument:

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

Följande exempel visar olika alternativ för att returnera dagdelen från born fältet för dessa dokument.

$dayOfWeek Operatör

Som namnet antyder, $dayOfWeek operatören returnerar veckodagen från ett datum.

Vi kan köra följande kod för att returnera veckodagen från born fältet i dokumentet ovan.

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

Resultat:

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

Det är också möjligt att ange tidszonen när du använder $dayOfWeek operatör.

Se MongoDB $dayOfWeek för mer information och exempel.

$dayOfMonth Operatör

$dayOfMonth operatören returnerar dagen i månaden från ett datum.

Exempel:

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

Resultat:

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

Du kan också ange tidszonen när du använder $dayOfMonth operatör.

Se MongoDB $dayOfMonth för mer information och exempel.

$dayOfYear Operatör

Japp, du gissade rätt. $dayOfYear operatören returnerar dagen på året från ett datum.

Exempel:

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

Resultat:

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

$dayOfYear operatören accepterar också en tidszonsparameter.

Se MongoDB $dayOfYear för mer information och exempel.

$dateToString Operatör

$dateToString operatorn konverterar ett datumobjekt till en sträng enligt ett användarspecificerat format. Användaren kan därför ange att endast dagsdelen returneras om så krävs.

Det finns formatspecifikationer för varje datumdel, och när det kommer till dagdelen har du ett val av formatspecifikationer som beror på om du vill returnera veckodagen, månadsdagen, dagen på året eller veckodag i ISO 8601-format.

Exempel:

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()

Resultat:

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

Vi kunde ha tillhandahållit fler formatspecifikationer för att inkludera andra datumdelar i resultatet, men eftersom vi bara är intresserade av att extrahera dagen i den här artikeln, använde vi bara formatspecifikationer för att returnera dagdelen.

Se MongoDB $dateToString för mer information och exempel.

Se även MongoDB $dateToString Formatspecifikationer för en lista med formatspecifikationer som du kan använda med $dateToString .

$dateToParts Operatör

$dateToParts operatören returnerar ett dokument som innehåller de beståndsdelar av ett givet BSON Date-värde som individuella egenskaper. De egenskaper som returneras är year , month , day , hour , minute , second och millisecond .

Vi kan därför använda $dateToParts i ett pipelinesteg, lägg sedan till ett annat pipelinesteg som extraherar day del om det behövs.

Här är vad $dateToParts returnerar för våra tre dokument:

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

Resultat:

{
	"dateParts" : {
		"year" : 2021,
		"month" : 1,
		"day" : 3,
		"hour" : 23,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	}
}
{
	"dateParts" : {
		"year" : 2019,
		"month" : 12,
		"day" : 8,
		"hour" : 4,
		"minute" : 0,
		"second" : 12,
		"millisecond" : 0
	}
}
{
	"dateParts" : {
		"year" : 2020,
		"month" : 9,
		"day" : 24,
		"hour" : 10,
		"minute" : 30,
		"second" : 0,
		"millisecond" : 0
	}
}

Dessa data kan skickas till nästa steg i pipelinen för att bara extrahera day fältet.

Här är vad som händer om vi lägger till ytterligare en projektion för bara day fält:

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

Resultat:

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

Detta är uppenbarligen inte lika kortfattat som att använda de tidigare alternativen. Men beroende på vad du gör i din pipeline kan detta tillvägagångssätt vara ett alternativ.

Det är också värt att nämna att $dateToParts accepterar en iso8601 parameter, som ändrar utdatadokumentet för att använda ISO-veckodatumfält.

Se MongoDB $dateToParts för mer information och exempel.

forEach() Metod

Du kan använda cursor.forEach() att iterera genom markören, med hjälp av en JavaScript-metod för att bara returnera dagsvärdet.

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

Resultat:

1
0
4

I det här fallet använder vi JavaScript getDay() metod, som returnerar ett heltal, mellan 0 och 6, motsvarande veckodagen för det givna datumet, enligt lokal tid.

Ett annat alternativ är att använda getUTCDay() metod, som använder universell tid. Vi kommer att använda den här metoden i nästa exempel.

Alternativt kunde vi ha använt JavaScript getDate() metod, som returnerar ett heltal, mellan 1 och 31, som representerar dagen i månaden för det givna datumet.

Dessutom returnerar det här alternativet bara det faktiska dagsvärdet, och inte hela dokumentet, som i de tidigare exemplen.

map() Metod

cursor.map() Metoden tillämpar en funktion på varje dokument som markören besöker och kombinerar värdena till en array.

Exempel:

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

Resultat:

[ 0, 0, 4 ]

Som nämnts, JavaScript getUTCDay() metod returnerar sitt resultat med universell tid. I det här fallet resulterade det i att ett annat värde returnerades för det första dokumentet (vi fick 0 i det här exemplet, kontra 1 i den föregående).

$isoDayOfWeek Operatör

Om du behöver returnera veckodagen i ISO 8601-format kan du använda $isoDayOfWeek . ISO 8601-året börjar med måndagen i vecka 1 och slutar med söndagen i sista veckan.

Exempel:

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

Resultat:

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

I det här fallet får vi ett helt annat resultat än vi fick när vi använde $dayOfWeek operatör, på grund av hur ISO 8601 beräknar datum.

Här är ett exempel som visar denna skillnad:

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

Resultat:

{ "birthDayOfWeek" : 1, "birthIsoDayOfWeek" : 7 }
{ "birthDayOfWeek" : 1, "birthIsoDayOfWeek" : 7 }
{ "birthDayOfWeek" : 5, "birthIsoDayOfWeek" : 4 }

  1. Hur man deserialiserar ett BsonDocument-objekt tillbaka till klassen

  2. Hur man skapar användare och lägger till roll i MongoDB

  3. Hur kan jag få värdet från Redis och lägga det i en variabel i NGiNX?

  4. MongoDB vs. Redis vs. Cassandra för en snabbskrivande, temporär radlagringslösning