W tej lekcji nauczysz się, jak korzystać z bardziej zaawansowanych zapytań, aby lepiej wyszukiwać i filtrować dane w kolekcjach MongoDB. Poznasz także metody walidacji danych, które umożliwiają przechowywanie w bazie danych tylko odpowiednio sformatowanych i kompletnych informacji. Skupimy się na przykładzie, który pokaże, jak tworzyć zaawansowane filtry oraz jak dodawać walidacje podczas wstawiania i aktualizowania dokumentów.
Przykład kodu – Zaawansowane Zapytania i Walidacja
Stwórz nowy plik o nazwie advancedQueries.js
i skopiuj do niego poniższy kod, aby zrozumieć, jak korzystać z zaawansowanych funkcji MongoDB.
// Importujemy MongoClient z biblioteki mongodb
const { MongoClient } = require('mongodb');
// Ustawiamy URL połączenia do lokalnej instancji MongoDB
const url = 'mongodb://localhost:27017';
// Definiujemy nazwę bazy danych, z którą będziemy pracować
const dbName = 'myAdvancedDatabase';
async function main() {
// Tworzymy nowego klienta MongoDB, podając mu URL do naszej bazy danych
const client = new MongoClient(url);
try {
// Nawiązujemy połączenie z serwerem MongoDB
await client.connect();
console.log('Połączono z MongoDB!');
// Uzyskujemy dostęp do bazy danych o nazwie "myAdvancedDatabase"
const db = client.db(dbName);
// Uzyskujemy dostęp do kolekcji "products"
const collection = db.collection('products');
// --- CREATE: Dodawanie dokumentów z walidacją danych ---
// Definiujemy przykładowe produkty do dodania w kolekcji
const products = [
{ name: 'Laptop', price: 1500, category: 'electronics', stock: 50 },
{ name: 'Telefon', price: 800, category: 'electronics', stock: 100 },
{ name: 'Blender', price: 200, category: 'home_appliances', stock: 30 },
{ name: 'Książka', price: 30, category: 'books', stock: 200 },
];
// Dodajemy produkty do kolekcji i stosujemy walidację cen (czy cena jest większa niż 0)
for (const product of products) {
if (product.price <= 0) {
console.log(`Produkt "${product.name}" ma nieprawidłową cenę!`);
continue; // Pomijamy produkty o nieprawidłowej cenie
}
const result = await collection.insertOne(product);
console.log(`Dodano produkt: ${product.name} o ID:`, result.insertedId);
}
// --- READ: Zaawansowane zapytania ---
// Znajdź wszystkie produkty w kategorii "electronics" z ceną powyżej 500
const expensiveElectronics = await collection.find({
category: 'electronics',
price: { $gt: 500 },
}).toArray();
console.log('Drogie produkty z kategorii "electronics":', expensiveElectronics);
// Znajdź produkty, które są w magazynie i ich ilość jest pomiędzy 30 a 100
const inStockProducts = await collection.find({
stock: { $gte: 30, $lte: 100 },
}).toArray();
console.log('Produkty w magazynie (ilość od 30 do 100):', inStockProducts);
// Użycie operatora $in do znalezienia produktów w określonych kategoriach
const selectedCategories = ['electronics', 'books'];
const filteredProducts = await collection.find({
category: { $in: selectedCategories },
}).toArray();
console.log('Produkty w wybranych kategoriach:', filteredProducts);
// --- UPDATE: Aktualizowanie z walidacją ---
// Zwiększ cenę wszystkich produktów w kategorii "books" o 10%
const updateBooksResult = await collection.updateMany(
{ category: 'books' }, // Warunek: wszystkie produkty w kategorii "books"
{ $mul: { price: 1.10 } } // Aktualizacja: mnożymy cenę przez 1.10 (zwiększamy o 10%)
);
console.log('Liczba zaktualizowanych produktów:', updateBooksResult.modifiedCount);
// Ustaw status "out_of_stock" dla produktów, które mają mniej niż 10 sztuk w magazynie
const updateStockResult = await collection.updateMany(
{ stock: { $lt: 10 } }, // Warunek: produkty, których stan magazynowy jest mniejszy niż 10
{ $set: { status: 'out_of_stock' } } // Ustawiamy nowe pole "status" na "out_of_stock"
);
console.log('Liczba zaktualizowanych produktów:', updateStockResult.modifiedCount);
// --- DELETE: Usuwanie z warunkiem ---
// Usunięcie wszystkich produktów z kategorii "home_appliances", które są droższe niż 300
const deleteExpensiveAppliances = await collection.deleteMany({
category: 'home_appliances',
price: { $gt: 300 },
});
console.log('Liczba usuniętych produktów:', deleteExpensiveAppliances.deletedCount);
} catch (error) {
console.error('Błąd podczas operacji na bazie danych:', error); // Obsługa błędów, wyświetla komunikat błędu
} finally {
// Zawsze zamykamy połączenie z bazą danych, nawet w przypadku błędu
await client.close();
}
}
// Wywołujemy główną funkcję
main().catch(console.error); // Obsługa błędów podczas uruchamiania funkcji głównej
Podsumowanie
W tej lekcji nauczyłeś się, jak używać bardziej zaawansowanych zapytań i walidacji danych w MongoDB:
- Dodawanie z walidacją: W przykładzie dodawania produktów zastosowaliśmy walidację, aby upewnić się, że cena jest większa niż 0 przed dodaniem do bazy danych.
- Zaawansowane zapytania: Użyliśmy operatorów takich jak
$gt
,$gte
,$lte
oraz$in
do filtrowania danych w bazie według różnych kryteriów. - Aktualizacja z walidacją: Aktualizowaliśmy wiele dokumentów naraz, zmieniając cenę produktów oraz ustawiając nowe pole na podstawie określonych warunków.
- Usuwanie z warunkiem: Usunęliśmy dokumenty na podstawie złożonych warunków, łącząc kilka kryteriów (kategoria i cena).
Dzięki zastosowaniu tych technik możesz tworzyć bardziej elastyczne i zaawansowane zapytania oraz lepiej kontrolować dane, które przechowujesz w MongoDB. W kolejnej lekcji przyjrzymy się agregacjom i sposobom tworzenia indeksów, aby zoptymalizować wydajność zapytań w Twojej aplikacji.
Jeżeli chcesz przyśpieszyć swoją naukę tworzenia stron chciałbym polecić mój kurs video JavaScript w którym nauczysz się tego języka od podstaw do zaawansowanych jego aspektów.