Когато извличаме деня от дата, точната опция, която използваме, ще зависи от това как искаме да бъде представен денят.
Например, искаме ли деня от седмицата, деня от месеца или деня от годината? Или може би го искаме във формат 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 }