MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

8 начина да получите деня от дата в MongoDB

Когато извличаме деня от дата, точната опция, която използваме, ще зависи от това как искаме да бъде представен денят.

Например, искаме ли деня от седмицата, деня от месеца или деня от годината? Или може би го искаме във формат ISO 8601? Връщаната стойност обикновено ще бъде различна в зависимост от това кой от тях изберем.

Тази статия разглежда тези опции и следователно представя 8 начина за връщане на дневната част от дата в MongoDB.

Примерни данни

Да предположим, че имаме колекция, наречена cats със следните документи:

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

Следващите примери демонстрират различни опции за връщане на дневната част от born поле на тези документи.

$dayOfWeek Оператор

Както подсказва името, $dayOfWeek операторът връща деня от седмицата от дата.

Можем да изпълним следния код, за да върнем деня от седмицата от born поле в горния документ.

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

Резултат:

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

Възможно е също да посочите часовата зона, когато използвате $dayOfWeek оператор.

Вижте MongoDB $dayOfWeek за повече информация и примери.

$dayOfMonth Оператор

$dayOfMonth операторът връща деня от месеца от дата.

Пример:

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

Резултат:

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

Можете също да посочите часовата зона, когато използвате $dayOfMonth оператор.

Вижте MongoDB $dayOfMonth за повече информация и примери.

$dayOfYear Оператор

Да, познахте. $dayOfYear операторът връща деня от годината от дата.

Пример:

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

Резултат:

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

$dayOfYear операторът приема и параметър на часовата зона.

Вижте MongoDB $dayOfYear за повече информация и примери.

$dateToString Оператор

$dateToString оператор преобразува обект за дата в низ според зададен от потребителя формат. Следователно потребителят може да посочи, че ако е необходимо, се връща само дневната част.

Има спецификатори на формат за всяка част от датата и когато става въпрос за частта от деня, имате избор от спецификатори на формат, който ще зависи от това дали искате да върнете деня от седмицата, ден от месеца, ден от годината или ден от седмицата във формат ISO 8601.

Пример:

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

Резултат:

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

Можехме да предоставим повече спецификатори на формат, за да включим други части от дата в резултата, но тъй като се интересуваме само от извличане на деня в тази статия, използвахме само спецификатори на формат за връщане на частта от деня.

Вижте MongoDB $dateToString за повече информация и примери.

Вижте също MongoDB $dateToString Форматни спецификатори за списък с спецификатори на формат, които можете да използвате с $dateToString .

$dateToParts Оператор

$dateToParts операторът връща документ, който съдържа съставните части на дадена стойност на датата на BSON като отделни свойства. Върнатите свойства са year , month , day , hour , minute , second и millisecond .

Следователно можем да използваме $dateToParts в един етап на конвейера, след това добавете друг етап на конвейера, който извлича day част, ако е необходимо.

Ето какво е $dateToParts връща за нашите три документа:

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

Резултат:

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

Тези данни могат да бъдат предадени на следващия етап в конвейера, за да се извлече само day поле.

Ето какво се случва, ако добавим друга проекция само за day поле:

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

Резултат:

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

Това очевидно не е толкова кратко, колкото използването на предишните опции. Въпреки това, в зависимост от това, което правите във вашия тръбопровод, този подход може да бъде опция.

Също така си струва да споменем, че $dateToParts приема iso8601 параметър, който модифицира изходния документ, за да използва полета за дата на ISO седмицата.

Вижте MongoDB $dateToParts за повече информация и примери.

forEach() Метод

Можете да използвате cursor.forEach() за да преминете през курсора, като използвате метод на JavaScript, за да върнете само стойността за деня.

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

Резултат:

1
0
4

В този случай използваме JavaScript getDay() метод, който връща цяло число между 0 и 6, съответстващо на деня от седмицата за дадена дата, според местното време.

Друга възможност е да използвате getUTCDay() метод, който използва универсално време. Ще използваме този метод в следващия пример.

Като алтернатива бихме могли да използваме JavaScript getDate() метод, който връща цяло число между 1 и 31, представляващо деня от месеца за дадена дата.

Освен това тази опция връща само действителната стойност на деня, а не целия документ, както в предишните примери.

map() Метод

cursor.map() Методът прилага функция към всеки документ, посетен от курсора, и комбинира стойностите в масив.

Пример:

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

Резултат:

[ 0, 0, 4 ]

Както споменахме, JavaScript getUTCDay() метод връща резултата си, използвайки универсално време. В този случай това доведе до връщане на различна стойност за първия документ (получахме 0 в този пример, срещу 1 в предишния).

$isoDayOfWeek Оператор

Ако трябва да върнете деня от седмицата във формат ISO 8601, можете да използвате $isoDayOfWeek . Годината по ISO 8601 започва с понеделник от седмица 1 и завършва с неделята на последната седмица.

Пример:

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

Резултат:

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

В този случай получаваме напълно различен резултат от този, който получихме при използване на $dayOfWeek оператор, поради начина, по който ISO 8601 изчислява датите.

Ето пример, който демонстрира тази разлика:

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

Резултат:

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

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongodb сумира размера на полетата на масива

  2. Геопространствено $близо до стойността на полето на текущия документ

  3. Влияние върху производителността при Meltdown върху MongoDB:AWS, Azure и DigitalOcean

  4. Mongodb concat int и низ

  5. Как да актуализирам стойността на конкретен вграден документ, вътре в масив, на конкретен документ в MongoDB?