sql >> Database >  >> NoSQL >> MongoDB

8 manieren om de dag van een date te krijgen in MongoDB

Wanneer we de dag uit een datum halen, hangt de exacte optie die we gebruiken af ​​van hoe we de dag willen weergeven.

Willen we bijvoorbeeld de dag van de week, de dag van de maand of de dag van het jaar? Of misschien willen we het in ISO 8601-formaat? De retourwaarde zal meestal anders zijn, afhankelijk van welke we kiezen.

Dit artikel onderzoekt die opties en presenteert daarom 8 manieren om het daggedeelte van een datum in MongoDB te retourneren.

Voorbeeldgegevens

Stel dat we een verzameling hebben met de naam cats met de volgende documenten:

{ "_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") }

De volgende voorbeelden demonstreren verschillende opties voor het retourneren van het dagdeel van de born veld van die documenten.

De $dayOfWeek Operator

Zoals de naam al aangeeft, is de $dayOfWeek operator retourneert de dag van de week vanaf een datum.

We kunnen de volgende code uitvoeren om de dag van de week te retourneren vanaf de born veld in bovenstaand document.

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

Resultaat:

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

Het is ook mogelijk om de tijdzone te specificeren bij gebruik van de $dayOfWeek exploitant.

Zie MongoDB $dayOfWeek voor meer informatie en voorbeelden.

De $dayOfMonth Operator

De $dayOfMonth operator retourneert de dag van de maand vanaf een datum.

Voorbeeld:

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

Resultaat:

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

U kunt ook de tijdzone specificeren bij gebruik van de $dayOfMonth exploitant.

Zie MongoDB $dayOfMonth voor meer informatie en voorbeelden.

De $dayOfYear Operator

Ja, je raadt het al. De $dayOfYear operator retourneert de dag van het jaar vanaf een datum.

Voorbeeld:

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

Resultaat:

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

De $dayOfYear operator accepteert ook een tijdzoneparameter.

Zie MongoDB $dayOfYear voor meer informatie en voorbeelden.

De $dateToString Operator

De $dateToString operator converteert een datumobject naar een string volgens een door de gebruiker gespecificeerd formaat. De gebruiker kan daarom specificeren dat indien nodig alleen het dagdeel wordt geretourneerd.

Er zijn formaatspecificaties voor elk datumgedeelte en als het gaat om het daggedeelte, hebt u de keuze uit formaatspecificaties die afhangen van of u de dag van de week, de dag van de maand, de dag van het jaar of de dag van de week in ISO 8601-formaat.

Voorbeeld:

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

Resultaat:

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

We hadden meer formaatspecificaties kunnen geven om andere datumdelen in het resultaat op te nemen, maar aangezien we in dit artikel alleen geïnteresseerd zijn in het extraheren van de dag, hebben we alleen formaatspecificaties gebruikt voor het retourneren van het daggedeelte.

Zie MongoDB $dateToString voor meer informatie en voorbeelden.

Zie ook MongoDB $dateToString Formaatspecificaties voor een lijst met formaatspecificaties die u kunt gebruiken met $dateToString .

De $dateToParts Operator

De $dateToParts operator retourneert een document dat de samenstellende delen van een bepaalde BSON-datumwaarde als individuele eigenschappen bevat. De geretourneerde eigenschappen zijn year , month , day , hour , minute , second en millisecond .

We kunnen daarom $dateToParts . gebruiken in één pijplijnfase, voeg vervolgens een andere pijplijnfase toe die de day . extraheert onderdeel indien nodig.

Dit is wat $dateToParts retouren voor onze drie documenten:

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

Resultaat:

{
	"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
	}
}

Deze gegevens kunnen worden doorgegeven aan de volgende fase in de pijplijn om alleen de day . te extraheren veld.

Dit is wat er gebeurt als we nog een projectie toevoegen voor alleen de day veld:

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

Resultaat:

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

Dit is natuurlijk niet zo beknopt als het gebruik van de vorige opties. Afhankelijk van wat u in uw pijplijn doet, kan deze aanpak echter een optie zijn.

Het is ook vermeldenswaard dat $dateToParts accepteert een iso8601 parameter, die het uitvoerdocument wijzigt om ISO-weekdatumvelden te gebruiken.

Zie MongoDB $dateToParts voor meer informatie en voorbeelden.

De forEach() Methode

U kunt cursor.forEach() . gebruiken om door de cursor te lopen, met behulp van een JavaScript-methode om alleen de dagwaarde te retourneren.

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

Resultaat:

1
0
4

In dit geval gebruiken we de JavaScript getDay() methode, die een geheel getal tussen 0 en 6 retourneert, dat overeenkomt met de dag van de week voor de opgegeven datum, volgens de lokale tijd.

Een andere optie is om de getUTCDay() . te gebruiken methode, die universele tijd gebruikt. We gebruiken deze methode in het volgende voorbeeld.

Als alternatief hadden we de JavaScript getDate() . kunnen gebruiken methode, die een geheel getal retourneert, tussen 1 en 31, dat de dag van de maand voor de opgegeven datum vertegenwoordigt.

Deze optie retourneert ook alleen de werkelijke dagwaarde, en niet het hele document, zoals in de vorige voorbeelden.

De map() Methode

De cursor.map() methode past een functie toe op elk document dat door de cursor wordt bezocht en combineert de waarden in een array.

Voorbeeld:

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

Resultaat:

[ 0, 0, 4 ]

Zoals gezegd, de JavaScript getUTCDay() methode retourneert het resultaat met behulp van universele tijd. In dit geval resulteerde dit in een andere waarde die werd geretourneerd voor het eerste document (we kregen 0 in dit voorbeeld, versus 1 in de vorige).

De $isoDayOfWeek Operator

Als u de dag van de week in ISO 8601-indeling moet retourneren, kunt u $isoDayOfWeek gebruiken . Het ISO 8601-jaar begint met de maandag van week 1 en eindigt met de zondag van de laatste week.

Voorbeeld:

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

Resultaat:

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

In dit geval krijgen we een heel ander resultaat dan we kregen bij het gebruik van de $dayOfWeek operator, vanwege de manier waarop ISO 8601 datums berekent.

Hier is een voorbeeld dat dit verschil laat zien:

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

Resultaat:

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

  1. Hoe mongodb opvragen met "like" met behulp van de java-api?

  2. Wat is het verschil tussen id en _id in mangoest?

  3. Hoe Node.js te gebruiken om een ​​SSH-tunnelverbinding te maken met een MongoDB-database

  4. Redis:Kan .rdb niet openen voor opslaan:Toestemming geweigerd