Zaawansowane Zapytania i Walidacja Danych w MongoDB

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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.

Scroll to Top