1.0
This commit is contained in:
commit
4b3b7f97d9
570
mongo.tex
Normal file
570
mongo.tex
Normal file
@ -0,0 +1,570 @@
|
||||
\documentclass{article}
|
||||
\usepackage{fontspec}
|
||||
\usepackage{polyglossia}
|
||||
\usepackage{geometry}
|
||||
\usepackage{graphicx}
|
||||
\usepackage{minted}
|
||||
\usepackage{xcolor}
|
||||
\usepackage{hyperref}
|
||||
\usepackage{tabularx}
|
||||
\usepackage{enumitem}
|
||||
|
||||
% Ustawienia języka polskiego
|
||||
\setmainlanguage{polish}
|
||||
\setotherlanguage{english}
|
||||
|
||||
\setlength{\parindent}{0pt}
|
||||
\renewcommand{\baselinestretch}{1.2}
|
||||
|
||||
\geometry{a4paper, margin=2.5cm}
|
||||
|
||||
% Ustawienia dla pakietu minted
|
||||
\usemintedstyle{vs}
|
||||
\setminted{
|
||||
fontsize=\normalsize,
|
||||
breaklines=true,
|
||||
breakanywhere=true,
|
||||
frame=single,
|
||||
framesep=2mm,
|
||||
linenos=true,
|
||||
tabsize=2
|
||||
}
|
||||
|
||||
\begin{document}
|
||||
|
||||
\begin{center}
|
||||
{\LARGE \textbf{ZTBD - sprawozdanie z projektu}}
|
||||
\\[1.5em]
|
||||
{\large 2025-05-24}\\[2em]
|
||||
\end{center}
|
||||
|
||||
\section*{Podstawowe informacje}
|
||||
|
||||
\begin{tabular}{ll}
|
||||
\textbf{Autorzy projektu:} & Mikołaj Kaczmarek (124942) \\
|
||||
& Piotr Wilma (124832) \\
|
||||
\textbf{Temat:} & Hotel \\
|
||||
\textbf{Wybrany zakres (ocena):} & 5,0 \\
|
||||
\textbf{Baza danych:} & \texttt{ztbd124942} \\
|
||||
\end{tabular}
|
||||
|
||||
|
||||
\section{Wprowadzenie}
|
||||
|
||||
Projekt obejmuje stworzenie bazy danych MongoDB dla hotelu.
|
||||
System zarządzania hotelem wymaga przechowywania danych o gościach, pokojach, rezerwacjach, pracownikach oraz usługach dodatkowych.
|
||||
Opracowana baza danych umożliwia śledzenie aktualnego stanu rezerwacji, zarządzanie dostępnością pokoi oraz realizację dodatkowych zamówień gości hotelowych.
|
||||
Rozwiązanie takie znajduje zastosowanie w każdym obiekcie hotelowym potrzebującym wszechstronnego systemu do zarządzania codzienną działalnością.
|
||||
|
||||
Główne funkcjonalności realizowane przez bazę danych obejmują:
|
||||
\begin{itemize}
|
||||
\item Przechowywanie informacji o gościach wraz z ich danymi kontaktowymi
|
||||
\item Zarządzanie pokojami hotelowymi i ich atrybutami
|
||||
\item Obsługę rezerwacji z informacją o terminach pobytu i statusie płatności
|
||||
\item Ewidencję pracowników hotelu z przypisaniem do działów
|
||||
\item Katalog usług dodatkowych oraz zamówień na te usługi
|
||||
\end{itemize}
|
||||
|
||||
|
||||
\section{Schemat bazy - kolekcje}
|
||||
|
||||
Opracowana baza danych składa się z 6 kolekcji, łącznie zawierających 30 dokumentów.
|
||||
Poniżej przedstawiono szczegółowy opis każdej kolekcji wraz z przykładowymi dokumentami.
|
||||
|
||||
\caption{Struktura bazy danych systemu hotelowego w MongoDB}
|
||||
|
||||
\subsection{Kolekcja: guests}
|
||||
|
||||
\textbf{Opis:} Przechowuje dane gości hotelowych wraz z informacjami kontaktowymi i dodatkowymi atrybutami.
|
||||
|
||||
\textbf{Liczba dokumentów:} 5
|
||||
|
||||
\textbf{Struktura dokumentu:}
|
||||
|
||||
\begin{minted}{javascript}
|
||||
{
|
||||
_id: ObjectId("..."),
|
||||
firstName: String,
|
||||
lastName: String,
|
||||
email: String,
|
||||
phoneNumber: String,
|
||||
address: {
|
||||
street: String,
|
||||
city: String,
|
||||
postalCode: String,
|
||||
country: String
|
||||
},
|
||||
dateOfBirth: Date,
|
||||
loyaltyPoints: Number,
|
||||
registrationDate: Date
|
||||
}
|
||||
\end{minted}
|
||||
|
||||
\textbf{Przykładowy dokument:}
|
||||
|
||||
\begin{minted}{javascript}
|
||||
{
|
||||
_id: ObjectId("..."),
|
||||
firstName: "Jan",
|
||||
lastName: "Kowalski",
|
||||
email: "jan.kowalski@email.com",
|
||||
phoneNumber: "+48123456789",
|
||||
address: {
|
||||
street: "Kwiatowa 12",
|
||||
city: "Warszawa",
|
||||
postalCode: "01-234",
|
||||
country: "Polska"
|
||||
},
|
||||
dateOfBirth: ISODate("1985-05-15T00:00:00Z"),
|
||||
loyaltyPoints: 120,
|
||||
registrationDate: ISODate("2020-03-10T00:00:00Z")
|
||||
}
|
||||
\end{minted}
|
||||
|
||||
\subsection{Kolekcja: rooms}
|
||||
|
||||
\textbf{Opis:} Zawiera informacje o pokojach hotelowych, ich typach, wyposażeniu i statusie dostępności.
|
||||
|
||||
\textbf{Liczba dokumentów:} 5
|
||||
|
||||
\textbf{Struktura dokumentu:}
|
||||
|
||||
\begin{minted}{javascript}
|
||||
{
|
||||
_id: ObjectId("..."),
|
||||
roomNumber: String,
|
||||
floor: Number,
|
||||
type: String,
|
||||
capacity: Number,
|
||||
pricePerNight: Number,
|
||||
amenities: [String],
|
||||
status: String,
|
||||
lastRenovation: Date
|
||||
}
|
||||
\end{minted}
|
||||
|
||||
\textbf{Przykładowy dokument:}
|
||||
|
||||
\begin{minted}{javascript}
|
||||
{
|
||||
_id: ObjectId("..."),
|
||||
roomNumber: "301",
|
||||
floor: 3,
|
||||
type: "Suite",
|
||||
capacity: 4,
|
||||
pricePerNight: 600.00,
|
||||
amenities: ["TV", "WiFi", "Minibar", "Klimatyzacja",
|
||||
"Sejf", "Ekspres do kawy", "Jacuzzi"],
|
||||
status: "Dostępny",
|
||||
lastRenovation: ISODate("2022-02-15T00:00:00Z")
|
||||
}
|
||||
\end{minted}
|
||||
|
||||
\subsection{Kolekcja: reservations}
|
||||
|
||||
\textbf{Opis:} Przechowuje informacje o rezerwacjach gości, zawiera referencje do kolekcji guests i rooms.
|
||||
|
||||
\textbf{Liczba dokumentów:} 5
|
||||
|
||||
\textbf{Struktura dokumentu:}
|
||||
|
||||
\begin{minted}{javascript}
|
||||
{
|
||||
_id: ObjectId("..."),
|
||||
guestId: ObjectId("..."),
|
||||
roomId: ObjectId("..."),
|
||||
checkInDate: Date,
|
||||
checkOutDate: Date,
|
||||
numberOfGuests: Number,
|
||||
totalPrice: Number,
|
||||
paymentStatus: String,
|
||||
specialRequests: [String],
|
||||
bookingDate: Date,
|
||||
status: String
|
||||
}
|
||||
\end{minted}
|
||||
|
||||
\textbf{Przykładowy dokument:}
|
||||
|
||||
\begin{minted}{javascript}
|
||||
{
|
||||
_id: ObjectId("..."),
|
||||
guestId: ObjectId("..."),
|
||||
roomId: ObjectId("..."),
|
||||
checkInDate: ISODate("2023-05-10T00:00:00Z"),
|
||||
checkOutDate: ISODate("2023-05-15T00:00:00Z"),
|
||||
numberOfGuests: 2,
|
||||
totalPrice: 1250.00,
|
||||
paymentStatus: "Opłacone",
|
||||
specialRequests: ["Późne zameldowanie", "Dodatkowa poduszka"],
|
||||
bookingDate: ISODate("2023-04-15T00:00:00Z"),
|
||||
status: "Potwierdzona"
|
||||
}
|
||||
\end{minted}
|
||||
|
||||
\subsection{Kolekcja: employees}
|
||||
|
||||
\textbf{Opis:} Zawiera dane pracowników hotelu wraz z informacjami o stanowisku, wynagrodzeniu i harmonogramie pracy.
|
||||
|
||||
\textbf{Liczba dokumentów:} 5
|
||||
|
||||
\textbf{Struktura dokumentu:}
|
||||
|
||||
\begin{minted}{javascript}
|
||||
{
|
||||
_id: ObjectId("..."),
|
||||
firstName: String,
|
||||
lastName: String,
|
||||
position: String,
|
||||
email: String,
|
||||
phoneNumber: String,
|
||||
dateOfBirth: Date,
|
||||
hireDate: Date,
|
||||
salary: Number,
|
||||
department: String,
|
||||
workSchedule: [String],
|
||||
address: {
|
||||
street: String,
|
||||
city: String,
|
||||
postalCode: String,
|
||||
country: String
|
||||
}
|
||||
}
|
||||
\end{minted}
|
||||
|
||||
\textbf{Przykładowy dokument:}
|
||||
|
||||
\begin{minted}{javascript}
|
||||
{
|
||||
_id: ObjectId("..."),
|
||||
firstName: "Tomasz",
|
||||
lastName: "Nowicki",
|
||||
position: "Szef kuchni",
|
||||
email: "tomasz.nowicki@hotel.com",
|
||||
phoneNumber: "+48567890123",
|
||||
dateOfBirth: ISODate("1975-03-10T00:00:00Z"),
|
||||
hireDate: ISODate("2018-06-01T00:00:00Z"),
|
||||
salary: 7500.00,
|
||||
department: "Restauracja",
|
||||
workSchedule: ["Poniedziałek", "Wtorek", "Środa", "Niedziela"],
|
||||
address: {
|
||||
street: "Słoneczna 8",
|
||||
city: "Pruszków",
|
||||
postalCode: "05-800",
|
||||
country: "Polska"
|
||||
}
|
||||
}
|
||||
\end{minted}
|
||||
|
||||
\subsection{Kolekcja: services}
|
||||
|
||||
\textbf{Opis:} Zawiera katalog usług dodatkowych oferowanych przez hotel.
|
||||
|
||||
\textbf{Liczba dokumentów:} 5
|
||||
|
||||
\textbf{Struktura dokumentu:}
|
||||
|
||||
\begin{minted}{javascript}
|
||||
{
|
||||
_id: ObjectId("..."),
|
||||
name: String,
|
||||
description: String,
|
||||
price: Number,
|
||||
category: String,
|
||||
availability: [String],
|
||||
location: String,
|
||||
requiresReservation: Boolean
|
||||
}
|
||||
\end{minted}
|
||||
|
||||
\textbf{Przykładowy dokument:}
|
||||
|
||||
\begin{minted}{javascript}
|
||||
{
|
||||
_id: ObjectId("..."),
|
||||
name: "Masaż relaksacyjny",
|
||||
description: "60-minutowy masaż relaksacyjny",
|
||||
price: 200.00,
|
||||
category: "SPA",
|
||||
availability: ["Poniedziałek", "Środa", "Piątek", "Sobota"],
|
||||
location: "Hotelowe SPA",
|
||||
requiresReservation: true
|
||||
}
|
||||
\end{minted}
|
||||
|
||||
\subsection{Kolekcja: serviceOrders}
|
||||
|
||||
\textbf{Opis:} Przechowuje zamówienia na usługi dodatkowe składane przez gości hotelowych.
|
||||
|
||||
\textbf{Liczba dokumentów:} 5
|
||||
|
||||
\textbf{Struktura dokumentu:}
|
||||
|
||||
\begin{minted}{javascript}
|
||||
{
|
||||
_id: ObjectId("..."),
|
||||
guestId: ObjectId("..."),
|
||||
reservationId: ObjectId("..."),
|
||||
serviceId: ObjectId("..."),
|
||||
orderDate: Date,
|
||||
quantity: Number,
|
||||
totalPrice: Number,
|
||||
status: String,
|
||||
comments: String
|
||||
}
|
||||
\end{minted}
|
||||
|
||||
\textbf{Przykładowy dokument:}
|
||||
|
||||
\begin{minted}{javascript}
|
||||
{
|
||||
_id: ObjectId("..."),
|
||||
guestId: ObjectId("..."),
|
||||
reservationId: ObjectId("..."),
|
||||
serviceId: ObjectId("..."),
|
||||
orderDate: ISODate("2023-06-18T00:00:00Z"),
|
||||
quantity: 1,
|
||||
totalPrice: 300.00,
|
||||
status: "Potwierdzone",
|
||||
comments: "Kolacja na 20:00, rocznica ślubu"
|
||||
}
|
||||
\end{minted}
|
||||
|
||||
|
||||
\section{Referencje między dokumentami}
|
||||
|
||||
W bazie danych zaimplementowano następujące referencje między dokumentami:
|
||||
|
||||
\begin{enumerate}
|
||||
\item \textbf{Rezerwacje (reservations) - Goście (guests)}
|
||||
\begin{itemize}
|
||||
\item Atrybut \texttt{guestId} w kolekcji \texttt{reservations} zawiera referencję do identyfikatora dokumentu z kolekcji \texttt{guests}
|
||||
\item Modeluje relację: "Gość dokonuje rezerwacji" (jeden gość może mieć wiele rezerwacji)
|
||||
\end{itemize}
|
||||
|
||||
\item \textbf{Rezerwacje (reservations) - Pokoje (rooms)}
|
||||
\begin{itemize}
|
||||
\item Atrybut \texttt{roomId} w kolekcji \texttt{reservations} zawiera referencję do identyfikatora dokumentu z kolekcji \texttt{rooms}
|
||||
\item Modeluje relację: "Rezerwacja dotyczy konkretnego pokoju" (jeden pokój może mieć wiele rezerwacji w różnych terminach)
|
||||
\end{itemize}
|
||||
|
||||
\item \textbf{Zamówienia usług (serviceOrders) - Goście (guests)}
|
||||
\begin{itemize}
|
||||
\item Atrybut \texttt{guestId} w kolekcji \texttt{serviceOrders} zawiera referencję do identyfikatora dokumentu z kolekcji \texttt{guests}
|
||||
\item Modeluje relację: "Gość zamawia usługę dodatkową" (jeden gość może złożyć wiele zamówień)
|
||||
\end{itemize}
|
||||
|
||||
\item \textbf{Zamówienia usług (serviceOrders) - Rezerwacje (reservations)}
|
||||
\begin{itemize}
|
||||
\item Atrybut \texttt{reservationId} w kolekcji \texttt{serviceOrders} zawiera referencję do identyfikatora dokumentu z kolekcji \texttt{reservations}
|
||||
\item Modeluje relację: "Zamówienie usługi jest przypisane do konkretnej rezerwacji" (jedna rezerwacja może mieć wiele zamówień usług)
|
||||
\end{itemize}
|
||||
|
||||
\item \textbf{Zamówienia usług (serviceOrders) - Usługi (services)}
|
||||
\begin{itemize}
|
||||
\item Atrybut \texttt{serviceId} w kolekcji \texttt{serviceOrders} zawiera referencję do identyfikatora dokumentu z kolekcji \texttt{services}
|
||||
\item Modeluje relację: "Zamówienie dotyczy konkretnej usługi" (jedna usługa może być zamawiana wielokrotnie)
|
||||
\end{itemize}
|
||||
\end{enumerate}
|
||||
|
||||
|
||||
\section{Zapytania}
|
||||
|
||||
\subsection{Zapytania wyszukujące (find)}
|
||||
|
||||
\subsubsection{Dostępne pokoje o pojemności większej niż 2 osoby}
|
||||
|
||||
\begin{minted}{javascript}
|
||||
// Zapytanie wyszukujące dostępne pokoje o pojemności większej niż 2 osoby
|
||||
db.rooms.find(
|
||||
{
|
||||
status: "Dostępny",
|
||||
capacity: { $gt: 2 }
|
||||
}
|
||||
)
|
||||
\end{minted}
|
||||
|
||||
Zapytanie zwraca wszystkie pokoje, które są obecnie dostępne i mogą pomieścić więcej niż 2 osoby.
|
||||
Wykorzystuje operator porównujący \texttt{\$gt} (greater than).
|
||||
|
||||
\subsubsection{Rezerwacje rozpoczynające się w określonym przedziale czasowym}
|
||||
|
||||
\begin{minted}{javascript}
|
||||
// Zapytanie wyszukujące rezerwacje z zameldowaniem w czerwcu 2023
|
||||
db.reservations.find(
|
||||
{
|
||||
checkInDate: {
|
||||
$gte: new Date("2023-06-01"),
|
||||
$lt: new Date("2023-07-01")
|
||||
}
|
||||
}
|
||||
)
|
||||
\end{minted}
|
||||
|
||||
Zapytanie zwraca wszystkie rezerwacje z datą zameldowania w czerwcu 2023.
|
||||
Wykorzystuje operatory porównujące \texttt{\$gte} (greater than or equal) i \texttt{\$lt} (less than).
|
||||
|
||||
\subsection{Zapytania grupujące (aggregate)}
|
||||
|
||||
\subsubsection{Średnia cena i liczba rezerwacji według typu pokoju}
|
||||
|
||||
\begin{minted}{javascript}
|
||||
// Zapytanie grupujące - statystyki rezerwacji wg typu pokoju
|
||||
db.reservations.aggregate([
|
||||
{
|
||||
$lookup: {
|
||||
from: "rooms",
|
||||
localField: "roomId",
|
||||
foreignField: "_id",
|
||||
as: "room"
|
||||
}
|
||||
},
|
||||
{
|
||||
$unwind: "$room"
|
||||
},
|
||||
{
|
||||
$group: {
|
||||
_id: "$room.type",
|
||||
averagePrice: { $avg: "$totalPrice" },
|
||||
totalReservations: { $sum: 1 },
|
||||
totalRevenue: { $sum: "$totalPrice" }
|
||||
}
|
||||
},
|
||||
{
|
||||
$sort: {
|
||||
totalRevenue: -1
|
||||
}
|
||||
},
|
||||
{
|
||||
$project: {
|
||||
roomType: "$_id",
|
||||
averagePrice: { $round: ["$averagePrice", 2] },
|
||||
totalReservations: 1,
|
||||
totalRevenue: 1,
|
||||
_id: 0
|
||||
}
|
||||
}
|
||||
])
|
||||
\end{minted}
|
||||
|
||||
Zapytanie łączy dane z kolekcji rezerwacji i pokoi, a następnie grupuje je według typu pokoju.
|
||||
Dla każdego typu pokoju obliczane są: średnia cena rezerwacji, liczba rezerwacji i całkowity przychód.
|
||||
Wyniki są sortowane według przychodu malejąco.
|
||||
Wykorzystane operatory to \texttt{\$group}, \texttt{\$lookup}, \texttt{\$sort} i \texttt{\$project}.
|
||||
|
||||
\subsubsection{Analiza zamówień usług dodatkowych według kategorii}
|
||||
|
||||
\begin{minted}{javascript}
|
||||
// Zapytanie grupujące - analiza zamówień usług wg kategorii
|
||||
db.serviceOrders.aggregate([
|
||||
{
|
||||
$lookup: {
|
||||
from: "services",
|
||||
localField: "serviceId",
|
||||
foreignField: "_id",
|
||||
as: "serviceDetails"
|
||||
}
|
||||
},
|
||||
{
|
||||
$unwind: "$serviceDetails"
|
||||
},
|
||||
{
|
||||
$match: {
|
||||
status: { $in: ["Potwierdzone", "Zrealizowane"] }
|
||||
}
|
||||
},
|
||||
{
|
||||
$group: {
|
||||
_id: "$serviceDetails.category",
|
||||
totalOrders: { $sum: 1 },
|
||||
totalRevenue: { $sum: "$totalPrice" },
|
||||
averageQuantity: { $avg: "$quantity" }
|
||||
}
|
||||
},
|
||||
{
|
||||
$sort: {
|
||||
totalOrders: -1
|
||||
}
|
||||
},
|
||||
{
|
||||
$limit: 5
|
||||
},
|
||||
{
|
||||
$project: {
|
||||
category: "$_id",
|
||||
totalOrders: 1,
|
||||
totalRevenue: { $round: ["$totalRevenue", 2] },
|
||||
averageQuantity: { $round: ["$averageQuantity", 2] },
|
||||
_id: 0
|
||||
}
|
||||
}
|
||||
])
|
||||
\end{minted}
|
||||
|
||||
Zapytanie analizuje zamówienia usług dodatkowych, łącząc dane z kolekcji zamówień i usług.
|
||||
Filtruje zamówienia o statusie "Potwierdzone" lub "Zrealizowane", grupuje je według kategorii usługi i oblicza statystyki: liczbę zamówień, całkowity przychód i średnią ilość zamówionych usług.
|
||||
Wyniki są sortowane według liczby zamówień i ograniczone do 5 najlepszych kategorii.
|
||||
Wykorzystane operatory to \texttt{\$lookup}, \texttt{\$match}, \texttt{\$group}, \texttt{\$sort}, \texttt{\$limit} i \texttt{\$project}.
|
||||
|
||||
\subsection{Zapytanie zliczające (count)}
|
||||
|
||||
\begin{minted}{javascript}
|
||||
// Zapytanie zliczające pokoje wg statusu dostępności
|
||||
db.rooms.countDocuments(
|
||||
{
|
||||
status: "Dostępny",
|
||||
pricePerNight: { $lt: 500 }
|
||||
}
|
||||
)
|
||||
\end{minted}
|
||||
|
||||
Zapytanie zwraca liczbę pokoi, które są obecnie dostępne i kosztują mniej niż 500 zł za noc.
|
||||
Wykorzystuje metodę \texttt{countDocuments} z parametrem query.
|
||||
|
||||
\subsection{Zapytanie o wartości unikalne (distinct)}
|
||||
|
||||
\begin{minted}{javascript}
|
||||
// Zapytanie o unikalne kraje pochodzenia gości
|
||||
db.guests.distinct(
|
||||
"address.country",
|
||||
{
|
||||
loyaltyPoints: { $gt: 50 }
|
||||
}
|
||||
)
|
||||
\end{minted}
|
||||
|
||||
Zapytanie zwraca listę unikalnych krajów pochodzenia gości, którzy posiadają więcej niż 50 punktów lojalnościowych.
|
||||
Wykorzystuje metodę \texttt{distinct} z parametrem query.
|
||||
|
||||
|
||||
\section{Indeksy}
|
||||
|
||||
W celu optymalizacji zapytań w bazie danych utworzono następujące indeksy:
|
||||
|
||||
\begin{minted}{javascript}
|
||||
// Indeks dla szybkiego wyszukiwania pokoi po numerze
|
||||
db.rooms.createIndex({ roomNumber: 1 }, { unique: true })
|
||||
|
||||
// Indeks dla szybkiego wyszukiwania gości po nazwisku i imieniu
|
||||
db.guests.createIndex({ lastName: 1, firstName: 1 })
|
||||
|
||||
// Indeks dla szybkiego wyszukiwania rezerwacji wg dat
|
||||
db.reservations.createIndex({ checkInDate: 1, checkOutDate: 1 })
|
||||
|
||||
// Indeks dla szybszego łączenia rezerwacji z pokojami
|
||||
db.reservations.createIndex({ roomId: 1 })
|
||||
|
||||
// Indeks dla szybszego łączenia rezerwacji z gośćmi
|
||||
db.reservations.createIndex({ guestId: 1 })
|
||||
|
||||
// Indeks dla szybkiego wyszukiwania usług wg kategorii i ceny
|
||||
db.services.createIndex({ category: 1, price: 1 })
|
||||
|
||||
// Indeks dla szybszego łączenia zamówień usług z usługami
|
||||
db.serviceOrders.createIndex({ serviceId: 1 })
|
||||
\end{minted}
|
||||
|
||||
Indeksy przyspieszają operacje wyszukiwania i łączenia danych, szczególnie w przypadku złożonych zapytań agregujących.
|
||||
Na przykład, indeks \texttt{roomNumber} zapewnia szybkie wyszukiwanie pokoju po jego numerze, a indeksy na polach \texttt{guestId} i \texttt{roomId} w kolekcji \texttt{reservations} przyspieszają operacje łączenia danych z różnych kolekcji.
|
||||
|
||||
\end{document}
|
||||
441
skrypt.js
Normal file
441
skrypt.js
Normal file
@ -0,0 +1,441 @@
|
||||
use ztbd124942;
|
||||
|
||||
// 1. Kolekcja: Goście
|
||||
db.guests.insertMany([
|
||||
{
|
||||
firstName: "Jan",
|
||||
lastName: "Kowalski",
|
||||
email: "jan.kowalski@email.com",
|
||||
phoneNumber: "+48123456789",
|
||||
address: {
|
||||
street: "Kwiatowa 12",
|
||||
city: "Warszawa",
|
||||
postalCode: "01-234",
|
||||
country: "Polska"
|
||||
},
|
||||
dateOfBirth: new Date("1985-05-15"),
|
||||
loyaltyPoints: 120,
|
||||
registrationDate: new Date("2020-03-10")
|
||||
},
|
||||
{
|
||||
firstName: "Anna",
|
||||
lastName: "Nowak",
|
||||
email: "anna.nowak@email.com",
|
||||
phoneNumber: "+48234567891",
|
||||
address: {
|
||||
street: "Polna 7",
|
||||
city: "Kraków",
|
||||
postalCode: "30-001",
|
||||
country: "Polska"
|
||||
},
|
||||
dateOfBirth: new Date("1990-11-22"),
|
||||
loyaltyPoints: 45,
|
||||
registrationDate: new Date("2021-01-15")
|
||||
},
|
||||
{
|
||||
firstName: "Thomas",
|
||||
lastName: "Schmidt",
|
||||
email: "thomas.schmidt@email.com",
|
||||
phoneNumber: "+49123456789",
|
||||
address: {
|
||||
street: "Hauptstrasse 8",
|
||||
city: "Berlin",
|
||||
postalCode: "10115",
|
||||
country: "Niemcy"
|
||||
},
|
||||
dateOfBirth: new Date("1978-07-30"),
|
||||
loyaltyPoints: 230,
|
||||
registrationDate: new Date("2019-06-20")
|
||||
},
|
||||
{
|
||||
firstName: "Maria",
|
||||
lastName: "Garcia",
|
||||
email: "maria.garcia@email.com",
|
||||
phoneNumber: "+34612345678",
|
||||
address: {
|
||||
street: "Calle Mayor 15",
|
||||
city: "Barcelona",
|
||||
postalCode: "08001",
|
||||
country: "Hiszpania"
|
||||
},
|
||||
dateOfBirth: new Date("1992-03-12"),
|
||||
loyaltyPoints: 85,
|
||||
registrationDate: new Date("2021-09-05")
|
||||
},
|
||||
{
|
||||
firstName: "John",
|
||||
lastName: "Smith",
|
||||
email: "john.smith@email.com",
|
||||
phoneNumber: "+441234567890",
|
||||
address: {
|
||||
street: "High Street 42",
|
||||
city: "London",
|
||||
postalCode: "SW1A 1AA",
|
||||
country: "Wielka Brytania"
|
||||
},
|
||||
dateOfBirth: new Date("1980-12-05"),
|
||||
loyaltyPoints: 175,
|
||||
registrationDate: new Date("2020-07-18")
|
||||
}
|
||||
]);
|
||||
|
||||
// 2. Kolekcja: Pokoje hotelowe
|
||||
db.rooms.insertMany([
|
||||
{
|
||||
roomNumber: "101",
|
||||
floor: 1,
|
||||
type: "Standard",
|
||||
capacity: 2,
|
||||
pricePerNight: 250.00,
|
||||
amenities: ["TV", "WiFi", "Minibar", "Klimatyzacja"],
|
||||
status: "Dostępny",
|
||||
lastRenovation: new Date("2021-03-15")
|
||||
},
|
||||
{
|
||||
roomNumber: "102",
|
||||
floor: 1,
|
||||
type: "Standard",
|
||||
capacity: 2,
|
||||
pricePerNight: 250.00,
|
||||
amenities: ["TV", "WiFi", "Minibar", "Klimatyzacja"],
|
||||
status: "Dostępny",
|
||||
lastRenovation: new Date("2021-03-20")
|
||||
},
|
||||
{
|
||||
roomNumber: "201",
|
||||
floor: 2,
|
||||
type: "Deluxe",
|
||||
capacity: 3,
|
||||
pricePerNight: 400.00,
|
||||
amenities: ["TV", "WiFi", "Minibar", "Klimatyzacja", "Sejf", "Ekspres do kawy"],
|
||||
status: "Zajęty",
|
||||
lastRenovation: new Date("2022-01-10")
|
||||
},
|
||||
{
|
||||
roomNumber: "301",
|
||||
floor: 3,
|
||||
type: "Suite",
|
||||
capacity: 4,
|
||||
pricePerNight: 600.00,
|
||||
amenities: ["TV", "WiFi", "Minibar", "Klimatyzacja", "Sejf", "Ekspres do kawy", "Jacuzzi"],
|
||||
status: "Dostępny",
|
||||
lastRenovation: new Date("2022-02-15")
|
||||
},
|
||||
{
|
||||
roomNumber: "302",
|
||||
floor: 3,
|
||||
type: "Apartament",
|
||||
capacity: 5,
|
||||
pricePerNight: 900.00,
|
||||
amenities: ["TV", "WiFi", "Minibar", "Klimatyzacja", "Sejf", "Ekspres do kawy", "Jacuzzi", "Sauna"],
|
||||
status: "Dostępny",
|
||||
lastRenovation: new Date("2022-02-20")
|
||||
}
|
||||
]);
|
||||
|
||||
// 3. Kolekcja: Usługi dodatkowe
|
||||
db.services.insertMany([
|
||||
{
|
||||
name: "Śniadanie",
|
||||
description: "Bufet śniadaniowy w godzinach 7:00-10:00",
|
||||
price: 50.00,
|
||||
category: "Gastronomia",
|
||||
availability: ["Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek", "Sobota", "Niedziela"],
|
||||
location: "Restauracja hotelowa",
|
||||
requiresReservation: false
|
||||
},
|
||||
{
|
||||
name: "Masaż relaksacyjny",
|
||||
description: "60-minutowy masaż relaksacyjny",
|
||||
price: 200.00,
|
||||
category: "SPA",
|
||||
availability: ["Poniedziałek", "Środa", "Piątek", "Sobota"],
|
||||
location: "Hotelowe SPA",
|
||||
requiresReservation: true
|
||||
},
|
||||
{
|
||||
name: "Transfer z lotniska",
|
||||
description: "Transport z lotniska do hotelu",
|
||||
price: 120.00,
|
||||
category: "Transport",
|
||||
availability: ["Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek", "Sobota", "Niedziela"],
|
||||
location: "Lotnisko",
|
||||
requiresReservation: true
|
||||
},
|
||||
{
|
||||
name: "Wynajem roweru",
|
||||
description: "Wypożyczenie roweru na cały dzień",
|
||||
price: 50.00,
|
||||
category: "Rekreacja",
|
||||
availability: ["Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek", "Sobota", "Niedziela"],
|
||||
location: "Recepcja",
|
||||
requiresReservation: false
|
||||
},
|
||||
{
|
||||
name: "Kolacja przy świecach",
|
||||
description: "Romantyczna kolacja dla dwojga",
|
||||
price: 300.00,
|
||||
category: "Gastronomia",
|
||||
availability: ["Piątek", "Sobota"],
|
||||
location: "Taras widokowy",
|
||||
requiresReservation: true
|
||||
}
|
||||
]);
|
||||
|
||||
// 4. Kolekcja: Pracownicy
|
||||
db.employees.insertMany([
|
||||
{
|
||||
firstName: "Piotr",
|
||||
lastName: "Wiśniewski",
|
||||
position: "Recepcjonista",
|
||||
email: "piotr.wisniewski@hotel.com",
|
||||
phoneNumber: "+48765432109",
|
||||
dateOfBirth: new Date("1988-10-15"),
|
||||
hireDate: new Date("2019-04-01"),
|
||||
salary: 4500.00,
|
||||
department: "Recepcja",
|
||||
workSchedule: ["Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek"],
|
||||
address: {
|
||||
street: "Jaśminowa 5",
|
||||
city: "Warszawa",
|
||||
postalCode: "02-123",
|
||||
country: "Polska"
|
||||
}
|
||||
},
|
||||
{
|
||||
firstName: "Marta",
|
||||
lastName: "Kowalczyk",
|
||||
position: "Pokojówka",
|
||||
email: "marta.kowalczyk@hotel.com",
|
||||
phoneNumber: "+48654321098",
|
||||
dateOfBirth: new Date("1992-05-22"),
|
||||
hireDate: new Date("2020-02-15"),
|
||||
salary: 3800.00,
|
||||
department: "Housekeeping",
|
||||
workSchedule: ["Wtorek", "Środa", "Czwartek", "Piątek", "Sobota"],
|
||||
address: {
|
||||
street: "Leśna 12",
|
||||
city: "Warszawa",
|
||||
postalCode: "03-456",
|
||||
country: "Polska"
|
||||
}
|
||||
},
|
||||
{
|
||||
firstName: "Tomasz",
|
||||
lastName: "Nowicki",
|
||||
position: "Szef kuchni",
|
||||
email: "tomasz.nowicki@hotel.com",
|
||||
phoneNumber: "+48567890123",
|
||||
dateOfBirth: new Date("1975-03-10"),
|
||||
hireDate: new Date("2018-06-01"),
|
||||
salary: 7500.00,
|
||||
department: "Restauracja",
|
||||
workSchedule: ["Poniedziałek", "Wtorek", "Środa", "Niedziela"],
|
||||
address: {
|
||||
street: "Słoneczna 8",
|
||||
city: "Pruszków",
|
||||
postalCode: "05-800",
|
||||
country: "Polska"
|
||||
}
|
||||
},
|
||||
{
|
||||
firstName: "Katarzyna",
|
||||
lastName: "Zielińska",
|
||||
position: "Manager",
|
||||
email: "katarzyna.zielinska@hotel.com",
|
||||
phoneNumber: "+48678901234",
|
||||
dateOfBirth: new Date("1982-11-28"),
|
||||
hireDate: new Date("2017-01-10"),
|
||||
salary: 9000.00,
|
||||
department: "Zarząd",
|
||||
workSchedule: ["Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek"],
|
||||
address: {
|
||||
street: "Złota 20",
|
||||
city: "Warszawa",
|
||||
postalCode: "00-120",
|
||||
country: "Polska"
|
||||
}
|
||||
},
|
||||
{
|
||||
firstName: "Marek",
|
||||
lastName: "Jankowski",
|
||||
position: "Konserwator",
|
||||
email: "marek.jankowski@hotel.com",
|
||||
phoneNumber: "+48789012345",
|
||||
dateOfBirth: new Date("1970-07-15"),
|
||||
hireDate: new Date("2019-09-01"),
|
||||
salary: 4200.00,
|
||||
department: "Utrzymanie",
|
||||
workSchedule: ["Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek"],
|
||||
address: {
|
||||
street: "Brzozowa 7",
|
||||
city: "Piaseczno",
|
||||
postalCode: "05-500",
|
||||
country: "Polska"
|
||||
}
|
||||
}
|
||||
]);
|
||||
|
||||
// 5. Kolekcja: Rezerwacje
|
||||
const jan_id = db.guests.findOne({firstName: "Jan", lastName: "Kowalski"})._id;
|
||||
const anna_id = db.guests.findOne({firstName: "Anna", lastName: "Nowak"})._id;
|
||||
const thomas_id = db.guests.findOne({firstName: "Thomas", lastName: "Schmidt"})._id;
|
||||
const maria_id = db.guests.findOne({firstName: "Maria", lastName: "Garcia"})._id;
|
||||
const john_id = db.guests.findOne({firstName: "John", lastName: "Smith"})._id;
|
||||
|
||||
const room101_id = db.rooms.findOne({roomNumber: "101"})._id;
|
||||
const room102_id = db.rooms.findOne({roomNumber: "102"})._id;
|
||||
const room201_id = db.rooms.findOne({roomNumber: "201"})._id;
|
||||
const room301_id = db.rooms.findOne({roomNumber: "301"})._id;
|
||||
const room302_id = db.rooms.findOne({roomNumber: "302"})._id;
|
||||
|
||||
|
||||
db.reservations.insertMany([
|
||||
{
|
||||
guestId: jan_id,
|
||||
roomId: room101_id,
|
||||
checkInDate: new Date("2023-05-10"),
|
||||
checkOutDate: new Date("2023-05-15"),
|
||||
numberOfGuests: 2,
|
||||
totalPrice: 1250.00,
|
||||
paymentStatus: "Opłacone",
|
||||
specialRequests: ["Późne zameldowanie", "Dodatkowa poduszka"],
|
||||
bookingDate: new Date("2023-04-15"),
|
||||
status: "Potwierdzona"
|
||||
},
|
||||
{
|
||||
guestId: anna_id,
|
||||
roomId: room201_id,
|
||||
checkInDate: new Date("2023-06-01"),
|
||||
checkOutDate: new Date("2023-06-10"),
|
||||
numberOfGuests: 3,
|
||||
totalPrice: 3600.00,
|
||||
paymentStatus: "Zaliczka",
|
||||
specialRequests: [],
|
||||
bookingDate: new Date("2023-05-01"),
|
||||
status: "Potwierdzona"
|
||||
},
|
||||
{
|
||||
guestId: thomas_id,
|
||||
roomId: room301_id,
|
||||
checkInDate: new Date("2023-05-20"),
|
||||
checkOutDate: new Date("2023-05-23"),
|
||||
numberOfGuests: 2,
|
||||
totalPrice: 1800.00,
|
||||
paymentStatus: "Oczekuje na płatność",
|
||||
specialRequests: ["Widok na miasto"],
|
||||
bookingDate: new Date("2023-05-05"),
|
||||
status: "Oczekująca"
|
||||
},
|
||||
{
|
||||
guestId: maria_id,
|
||||
roomId: room102_id,
|
||||
checkInDate: new Date("2023-07-15"),
|
||||
checkOutDate: new Date("2023-07-20"),
|
||||
numberOfGuests: 1,
|
||||
totalPrice: 1250.00,
|
||||
paymentStatus: "Opłacone",
|
||||
specialRequests: [],
|
||||
bookingDate: new Date("2023-05-20"),
|
||||
status: "Potwierdzona"
|
||||
},
|
||||
{
|
||||
guestId: john_id,
|
||||
roomId: room302_id,
|
||||
checkInDate: new Date("2023-06-15"),
|
||||
checkOutDate: new Date("2023-06-20"),
|
||||
numberOfGuests: 4,
|
||||
totalPrice: 4500.00,
|
||||
paymentStatus: "Zaliczka",
|
||||
specialRequests: ["Łóżeczko dla dziecka", "Późne wymeldowanie"],
|
||||
bookingDate: new Date("2023-05-10"),
|
||||
status: "Potwierdzona"
|
||||
}
|
||||
]);
|
||||
|
||||
|
||||
// 6. Kolekcja: Zamówienia usług
|
||||
const breakfast_id = db.services.findOne({name: "Śniadanie"})._id;
|
||||
const massage_id = db.services.findOne({name: "Masaż relaksacyjny"})._id;
|
||||
const transfer_id = db.services.findOne({name: "Transfer z lotniska"})._id;
|
||||
const bike_id = db.services.findOne({name: "Wynajem roweru"})._id;
|
||||
const dinner_id = db.services.findOne({name: "Kolacja przy świecach"})._id;
|
||||
|
||||
const jan_res_id = db.reservations.findOne({guestId: jan_id})._id;
|
||||
const anna_res_id = db.reservations.findOne({guestId: anna_id})._id;
|
||||
const thomas_res_id = db.reservations.findOne({guestId: thomas_id})._id;
|
||||
const maria_res_id = db.reservations.findOne({guestId: maria_id})._id;
|
||||
const john_res_id = db.reservations.findOne({guestId: john_id})._id;
|
||||
|
||||
|
||||
db.serviceOrders.insertMany([
|
||||
{
|
||||
guestId: jan_id,
|
||||
reservationId: jan_res_id,
|
||||
serviceId: breakfast_id,
|
||||
orderDate: new Date("2023-05-11"),
|
||||
quantity: 2,
|
||||
totalPrice: 100.00,
|
||||
status: "Zrealizowane",
|
||||
comments: "Śniadanie do pokoju"
|
||||
},
|
||||
{
|
||||
guestId: thomas_id,
|
||||
reservationId: thomas_res_id,
|
||||
serviceId: massage_id,
|
||||
orderDate: new Date("2023-05-21"),
|
||||
quantity: 1,
|
||||
totalPrice: 200.00,
|
||||
status: "Potwierdzone",
|
||||
comments: "Masaż na godzinę 15:00"
|
||||
},
|
||||
{
|
||||
guestId: anna_id,
|
||||
reservationId: anna_res_id,
|
||||
serviceId: transfer_id,
|
||||
orderDate: new Date("2023-06-01"),
|
||||
quantity: 1,
|
||||
totalPrice: 120.00,
|
||||
status: "Potwierdzone",
|
||||
comments: "Odbiór z lotniska o 14:30"
|
||||
},
|
||||
{
|
||||
guestId: maria_id,
|
||||
reservationId: maria_res_id,
|
||||
serviceId: bike_id,
|
||||
orderDate: new Date("2023-07-16"),
|
||||
quantity: 2,
|
||||
totalPrice: 100.00,
|
||||
status: "Oczekujące",
|
||||
comments: "Dwa rowery na cały dzień"
|
||||
},
|
||||
{
|
||||
guestId: john_id,
|
||||
reservationId: john_res_id,
|
||||
serviceId: dinner_id,
|
||||
orderDate: new Date("2023-06-18"),
|
||||
quantity: 1,
|
||||
totalPrice: 300.00,
|
||||
status: "Potwierdzone",
|
||||
comments: "Kolacja na 20:00, rocznica ślubu"
|
||||
}
|
||||
]);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
db.rooms.createIndex({ roomNumber: 1 }, { unique: true })
|
||||
|
||||
db.guests.createIndex({ lastName: 1, firstName: 1 })
|
||||
|
||||
db.reservations.createIndex({ checkInDate: 1, checkOutDate: 1 })
|
||||
|
||||
db.reservations.createIndex({ roomId: 1 })
|
||||
|
||||
db.reservations.createIndex({ guestId: 1 })
|
||||
|
||||
db.services.createIndex({ category: 1, price: 1 })
|
||||
|
||||
db.serviceOrders.createIndex({ serviceId: 1 })
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user