Udostępnij za pośrednictwem


Łączenie aplikacji Node.js Mongoose z usługą Azure Cosmos DB

DOTYCZY: MongoDB

W tym samouczku przedstawiono sposób użycia platformy Mongoose do zapisywania danych w usłudze Azure Cosmos DB. W tym przewodniku użyjemy interfejsu API usługi Azure Cosmos DB dla bazy danych MongoDB. Mongoose to platforma modelowania obiektów usługi MongoDB w środowisku Node.js. Udostępnia ona także proste, bazujące na schematach rozwiązanie do modelowania danych aplikacji.

Azure Cosmos DB to dystrybuowana globalnie, wielomodelowa usługa bazy danych udostępniana przez Microsoft. Dzięki wykorzystaniu dystrybucji globalnej i możliwości skalowania poziomego opartego na usłudze Azure Cosmos DB, możesz szybko tworzyć i za pomocą zapytań badać bazy danych dokumentów, par klucz/wartość oraz grafów.

Wymagania wstępne

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto platformy Azure.

Możesz bezpłatnie wypróbować usługę Azure Cosmos DB bez subskrypcji platformy Azure i bez zobowiązania. Alternatywnie możesz utworzyć konto warstwy bezpłatnej usługi Azure Cosmos DB z pierwszymi 1000 RU/s i 25 GB miejsca do magazynowania bezpłatnie. Możesz również użyć emulatora usługi Azure Cosmos DB z identyfikatorem URI .https://localhost:8081 Aby uzyskać klucz do użycia z emulatorem, zobacz Uwierzytelnianie żądań.

Node.js w wersji 0.10.29 lub nowszej.

Tworzenie konta usługi Azure Cosmos DB

Utwórzmy konto usługi Azure Cosmos DB. Jeśli masz już konto, którego chcesz użyć, możesz przejść od razu do kroku Konfigurowanie aplikacji Node.js. Jeśli używasz emulatora usługi Azure Cosmos DB, wykonaj kroki opisane w temacie Emulator usługi Azure Cosmos DB, aby skonfigurować emulator i przejść do sekcji Konfigurowanie aplikacji Node.js.



  1. W nowym oknie przeglądarki zaloguj się do witryny Azure Portal.

  2. W menu po lewej stronie wybierz pozycję Utwórz zasób.

    Zrzut ekranu przedstawiający tworzenie zasobu w witrynie Azure Portal.

  3. Na stronie Nowy wybierz pozycję Bazy danych>Azure Cosmos DB.

    Zrzut ekranu przedstawiający okienko Bazy danych witryny Azure Portal.

  4. Na stronie Wybierz interfejs API wybierz pozycję Azure Cosmos DB for MongoDB Create (Utwórz bazę danych MongoDB>w usłudze Azure Cosmos DB).

    Interfejs API określa typ konta do utworzenia. Wybierz pozycję Azure Cosmos DB for MongoDB , ponieważ utworzysz kolekcję, która współpracuje z bazą danych MongoDB w tym przewodniku Szybki start. Aby dowiedzieć się więcej, zobacz Omówienie usługi Azure Cosmos DB dla bazy danych MongoDB.

    Zrzut ekranu przedstawiający okienko opcji Wybierz interfejs API.

  5. Na stronie Tworzenie konta usługi Azure Cosmos DB wprowadź ustawienia nowego konta usługi Azure Cosmos DB.

    Ustawienie Wartość Opis
    Subskrypcja Nazwa subskrypcji Wybierz subskrypcję platformy Azure, która ma być używana dla tego konta usługi Azure Cosmos DB.
    Grupa zasobów Nazwa grupy zasobów Wybierz grupę zasobów lub wybierz pozycję Utwórz nową, a następnie wprowadź unikatową nazwę nowej grupy zasobów.
    Nazwa konta Wprowadź unikatową nazwę Wprowadź unikatową nazwę do identyfikacji konta usługi Azure Cosmos DB. Identyfikator URI konta zostanie mongo.cosmos.azure.com dołączony do unikatowej nazwy konta.

    Nazwa konta może używać tylko małych liter, cyfr i łączników (-) i musi mieć długość od 3 do 44 znaków.
    Lokalizacja Region najbliżej Twoich użytkowników Wybierz lokalizację geograficzną, w której będzie hostowane konto usługi Azure Cosmos DB. Użyj lokalizacji znajdującej się najbliżej Twoich użytkowników, aby zapewnić im najszybszy dostęp do danych.
    Tryb wydajności Aprowizowana przepływność lub bezserwerowa Wybierz pozycję Aprowizowana przepływność , aby utworzyć konto w trybie aprowizowanej przepływności . Wybierz pozycję Bezserwerowe , aby utworzyć konto w trybie bezserwerowym .

    Uwaga: tylko interfejs API dla bazy danych MongoDB w wersji 4.2, 4.0 i 3.6 są obsługiwane przez konta bezserwerowe. Wybranie wersji 3.2 spowoduje wymusinie na koncie trybu aprowizowanej przepływności.
    Stosowanie rabatu za bezpłatną warstwę usługi Azure Cosmos DB Zastosuj lub nie zastosuj W warstwie Bezpłatna usługi Azure Cosmos DB uzyskasz pierwsze 1000 RU/s i 25 GB miejsca do magazynowania bezpłatnie na koncie. Dowiedz się więcej o warstwie Bezpłatna.
    Wersja Wybierz wymaganą wersję serwera Usługa Azure Cosmos DB dla bazy danych MongoDB jest zgodna z wersją serwera w wersji 4.2, 4.0, 3.6 i 3.2. Możesz uaktualnić lub obniżyć poziom konta po jego utworzeniu.

    Uwaga

    W ramach jednej subskrypcji platformy Azure można korzystać z maksymalnie jednego konta usługi Azure Cosmos DB w warstwie Bezpłatna. Tę opcję należy wybrać podczas tworzenia konta. Jeśli opcja zastosowania rabatu na podstawie warstwy Bezpłatna nie jest widoczna, inne konto w subskrypcji już korzysta z warstwy Bezpłatna.

    Zrzut ekranu przedstawiający stronę nowego konta dla usługi Azure Cosmos DB.

  6. Na karcie Dystrybucja globalna skonfiguruj następujące szczegóły. Możesz pozostawić wartości domyślne na potrzeby tego przewodnika Szybki start:

    Ustawienie Wartość Opis
    Nadmiarowość geograficzna Wyłącz Włącz lub wyłącz dystrybucję globalną na koncie, łącząc region z regionem pary. Później możesz dodać więcej regionów do swojego konta.
    Zapis w wielu regionach Wyłącz Funkcja zapisu w wielu regionach umożliwia korzystanie z aprowizowanej przepływności dla baz danych i kontenerów na całym świecie.

    Uwaga

    Następujące opcje nie są dostępne w przypadku wybrania opcji Bezserwerowa jako tryb pojemności:

    • Zastosuj rabat w warstwie Bezpłatna
    • Nadmiarowość geograficzna
    • Zapis w wielu regionach
  7. Opcjonalnie możesz skonfigurować dodatkowe szczegóły na następujących kartach:

    • Sieć — konfigurowanie dostępu z sieci wirtualnej.
    • Zasady tworzenia kopii zapasowych — skonfiguruj zasady okresowych lub ciągłych kopii zapasowych .
    • Szyfrowanie — użyj klucza zarządzanego przez usługę lub klucza zarządzanego przez klienta.
    • Tagi — tagi to pary nazw/wartości, które umożliwiają kategoryzowanie zasobów i wyświetlanie skonsolidowanego rozliczeń przez zastosowanie tego samego tagu do wielu zasobów i grup zasobów.
  8. Wybierz pozycję Przejrzyj i utwórz.

  9. Tworzenie konta potrwa kilka minut. Poczekaj, aż portal wyświetli gratulacje ! Twoje konto usługi Azure Cosmos DB dla bazy danych MongoDB jest gotowe .

    Zrzut ekranu przedstawiający okienko Powiadomienia w witrynie Azure Portal.

Utwórz bazę danych

W tej aplikacji omówimy dwa sposoby tworzenia kolekcji w usłudze Azure Cosmos DB:

  • Przechowywanie każdego modelu obiektów w oddzielnej kolekcji: zalecamy utworzenie bazy danych z dedykowaną przepływnością. Użycie tego modelu pojemności zapewni lepszą efektywność kosztową.

    Node.js samouczka — zrzut ekranu witryny Azure Portal przedstawiający sposób tworzenia bazy danych w Eksploratorze danych dla konta usługi Azure Cosmos DB do użycia z modułem Mongoose Node

  • Przechowywanie wszystkich modeli obiektów w pojedynczej kolekcji usługi Azure Cosmos DB: jeśli wolisz przechowywać wszystkie modele w jednej kolekcji, możesz utworzyć nową bazę danych bez wybrania opcji Aprowizowanie przepływności. Użycie tego modelu pojemności spowoduje utworzenie każdej kolekcji z własną pojemnością przepływności dla każdego modelu obiektów.

Po utworzeniu bazy danych użyjesz nazwy w poniższej zmiennej środowiskowej COSMOSDB_DBNAME .

Konfigurowanie aplikacji Node.js

Uwaga

Jeśli chcesz tylko prześledzić przykładowy kod bez konfigurowania samej aplikacji, sklonuj przykład używany na potrzeby tego samouczka i skompiluj aplikację Mongoose napisaną w języku Node.js w usłudze Azure Cosmos DB.

  1. Aby utworzyć aplikację Node.js w wybranym folderze, uruchom następujące polecenie w wierszu polecenia węzła.

    npm init

    Po odpowiedzeniu na wyświetlone pytania projekt będzie gotowy.

  2. Dodaj nowy plik do folderu i nadaj mu nazwę index.js.

  3. Zainstaluj wymagane pakiety przy użyciu jednej z opcji polecenia npm install:

    • Mongoose: npm install mongoose --save

    Uwaga

    Aby uzyskać więcej informacji na temat wersji bazy danych Mongoose zgodnej z wersją serwera interfejsu API dla bazy danych MongoDB, zobacz zgodność z platformą Mongoose.

    • Dotenv (jeśli chcesz załadować wpisy tajne z pliku env): npm install dotenv --save

      Uwaga

      Parametr --save powoduje dodanie zależności do pliku package.json.

  4. Zaimportuj zależności w pliku index.js .

    var mongoose = require('mongoose');
    var env = require('dotenv').config();   //Use the .env file to load the variables
    
  5. Dodaj parametry połączenia usługi Azure Cosmos DB i nazwę usługi Azure Cosmos DB do .env pliku. Zastąp symbole zastępcze {cosmos-account-name} i {dbname} własną nazwą konta usługi Azure Cosmos DB i nazwą bazy danych bez symboli nawiasów klamrowych.

    // You can get the following connection details from the Azure portal. You can find the details on the Connection string pane of your Azure Cosmos DB account.
    
    COSMOSDB_USER = "<Azure Cosmos DB account's user name, usually the database account name>"
    COSMOSDB_PASSWORD = "<Azure Cosmos DB account password, this is one of the keys specified in your account>"
    COSMOSDB_DBNAME = "<Azure Cosmos DB database name>"
    COSMOSDB_HOST= "<Azure Cosmos DB Host name>"
    COSMOSDB_PORT=10255
    
  6. Nawiąż połączenie z usługą Azure Cosmos DB przy użyciu platformy Mongoose, dodając następujący kod na końcu pliku index.js.

    mongoose.connect("mongodb://"+process.env.COSMOSDB_HOST+":"+process.env.COSMOSDB_PORT+"/"+process.env.COSMOSDB_DBNAME+"?ssl=true& replicaSet=globaldb", {
       auth: {
         username: process.env.COSMOSDB_USER,
         password: process.env.COSMOSDB_PASSWORD
       },
       useNewUrlParser: true,
       useUnifiedTopology: true,
       retryWrites: false
    })
    .then(() => console.log('Connection to CosmosDB successful'))
    .catch((err) => console.error(err));
    

    Uwaga

    W tym miejscu zmienne środowiskowe są ładowane przy użyciu pliku process.env. {variableName} przy użyciu dotenv pakietu npm.

    Teraz, po nawiązaniu połączenia z usługą Azure Cosmos DB, możesz rozpocząć konfigurowanie modeli obiektów na platformie Mongoose.

Najlepsze rozwiązania dotyczące korzystania z usługi Mongoose z usługą Azure Cosmos DB

Dla każdego tworzonego modelu usługa Mongoose tworzy nową kolekcję. Jest to najlepiej rozwiązane przy użyciu opcji Przepływność na poziomie bazy danych, która została wcześniej omówiona. Aby użyć pojedynczej kolekcji, należy użyć dyskryminujących platformy Mongoose. Dyskryminatory to mechanizm dziedziczenia schematów. Umożliwiają one posiadanie wielu modeli z nakładającymi się schematami w jednej bazowej kolekcji usługi MongoDB.

Dzięki temu można przechowywać różne modele danych w tej samej kolekcji, a następnie, korzystając z klauzuli filtru w czasie przetwarzania zapytania, pobierać tylko potrzebne dane. Przyjrzyjmy się każdemu z modeli.

Jedna kolekcja na model obiektów

W tej sekcji opisano, jak to osiągnąć za pomocą interfejsu API usługi Azure Cosmos DB dla bazy danych MongoDB. Ta metoda jest naszym zalecanym podejściem, ponieważ umożliwia kontrolowanie kosztów i pojemności. W związku z tym ilość jednostek żądań w bazie danych nie zależy od liczby modeli obiektów. Jest to domyślny model operacyjny dla platformy Mongoose, więc możesz zapoznać się z tym.

  1. Otwórz ponownie plik index.js.

  2. Utwórz definicję schematu modelu „Family” (Rodzina).

    const Family = mongoose.model('Family', new mongoose.Schema({
        lastName: String,
        parents: [{
            familyName: String,
            firstName: String,
            gender: String
        }],
        children: [{
            familyName: String,
            firstName: String,
            gender: String,
            grade: Number
        }],
        pets:[{
            givenName: String
        }],
        address: {
            country: String,
            state: String,
            city: String
        }
    }));
    
  3. Utwórz obiekt w modelu „Family” (Rodzina).

    const family = new Family({
        lastName: "Volum",
        parents: [
            { firstName: "Thomas" },
            { firstName: "Mary Kay" }
        ],
        children: [
            { firstName: "Ryan", gender: "male", grade: 8 },
            { firstName: "Patrick", gender: "male", grade: 7 }
        ],
        pets: [
            { givenName: "Buddy" }
        ],
        address: { country: "USA", state: "WA", city: "Seattle" }
    });
    
  4. Na koniec zapisz ten obiekt w usłudze Azure Cosmos DB. Spowoduje to utworzenie kolekcji w obiekcie nadrzędnym.

    family.save((err, saveFamily) => {
        console.log(JSON.stringify(saveFamily));
    });
    
  5. Teraz utwórzmy jeszcze jeden schemat i obiekt. Tym razem utwórzmy te elementy dla modelu „Vacation Destinations” (Miejsca spędzania wakacji) zawierającego miejsca atrakcyjne dla rodziny.

    1. Podobnie jak wcześniej utwórz schemat.

      const VacationDestinations = mongoose.model('VacationDestinations', new mongoose.Schema({
       name: String,
       country: String
      }));
      
    2. Utwórz przykładowy obiekt (do tego schematu można dodać wiele obiektów) i zapisz go.

      const vacaySpot = new VacationDestinations({
       name: "Honolulu",
       country: "USA"
      });
      
      vacaySpot.save((err, saveVacay) => {
       console.log(JSON.stringify(saveVacay));
      });
      
  6. Po przejściu do witryny Azure Portal można teraz zauważyć dwie kolekcje utworzone w usłudze Azure Cosmos DB.

    samouczek Node.js — zrzut ekranu witryny Azure Portal przedstawiający konto usługi Azure Cosmos DB z wyróżnionymi wieloma nazwami kolekcji — baza danych Node

  7. Na koniec spróbujmy odczytać dane z usługi Azure Cosmos DB. Ponieważ korzystamy z domyślnego modelu działania platformy Mongoose, operacje odczytywania są takie same jak inne operacje odczytywania na platformie Mongoose.

    Family.find({ 'children.gender' : "male"}, function(err, foundFamily){
        foundFamily.forEach(fam => console.log("Found Family: " + JSON.stringify(fam)));
    });
    

Korzystanie z dyskryminatorów platformy Mongoose w celu umożliwienia przechowywania danych w pojedynczej kolekcji

W tej metodzie używamy dyskryminujących platformy Mongoose, aby zoptymalizować koszty każdej kolekcji. Dyskryminatory umożliwiają zdefiniowanie różnicującego „klucza”, który umożliwi przechowywanie, różnicowanie i filtrowanie różnych modeli obiektów.

W tym miejscu utworzymy bazowy model obiektów, zdefiniujemy klucz różnicujący i dodamy modele „Family” i „VacationDestinations” jako rozszerzenia modelu bazowego.

  1. Ustawmy podstawową konfigurację i zdefiniujmy klucz dyskryminatora.

    const baseConfig = {
        discriminatorKey: "_type", //If you've got a lot of different data types, you could also consider setting up a secondary index here.
        collection: "alldata"   //Name of the Common Collection
    };
    
  2. Następnie zdefiniujmy wspólny model obiektów.

    const commonModel = mongoose.model('Common', new mongoose.Schema({}, baseConfig));
    
  3. Teraz definiujemy model „Family”. Zauważ, że teraz używamy metody commonModel.discriminator zamiast mongoose.model. Ponadto dodajemy również podstawową konfigurację do schematu mongoose. W tym przypadku kluczem dyskryminatora jest więc FamilyType.

    const Family_common = commonModel.discriminator('FamilyType', new     mongoose.Schema({
        lastName: String,
        parents: [{
            familyName: String,
            firstName: String,
            gender: String
        }],
        children: [{
            familyName: String,
            firstName: String,
           gender: String,
            grade: Number
        }],
        pets:[{
            givenName: String
        }],
        address: {
            country: String,
            state: String,
            city: String
        }
    }, baseConfig));
    
  4. Podobnie dodajmy kolejny schemat, tym razem dla modelu „VacationDestinations”. Tutaj kluczem dyskryminatora jest VacationDestinationsType.

    const Vacation_common = commonModel.discriminator('VacationDestinationsType', new mongoose.Schema({
        name: String,
        country: String
    }, baseConfig));
    
  5. Na koniec utworzymy obiekty modelu i zapiszemy go.

    1. Dodajmy obiekty do modelu „Family”.

      const family_common = new Family_common({
       lastName: "Volum",
       parents: [
           { firstName: "Thomas" },
           { firstName: "Mary Kay" }
       ],
       children: [
           { firstName: "Ryan", gender: "male", grade: 8 },
           { firstName: "Patrick", gender: "male", grade: 7 }
       ],
       pets: [
           { givenName: "Buddy" }
       ],
       address: { country: "USA", state: "WA", city: "Seattle" }
      });
      
      family_common.save((err, saveFamily) => {
       console.log("Saved: " + JSON.stringify(saveFamily));
      });
      
    2. Następnie dodajmy obiekty do modelu „VacationDestinations” i zapiszmy go.

      const vacay_common = new Vacation_common({
       name: "Honolulu",
       country: "USA"
      });
      
      vacay_common.save((err, saveVacay) => {
       console.log("Saved: " + JSON.stringify(saveVacay));
      });
      
  6. Jeśli teraz wrócisz do witryny Azure Portal, zauważysz, że znajduje się tam tylko jedna kolekcja o nazwie alldata, która zawiera dane zarówno z modelu „Family”, jak i „VacationDestinations”.

    Node.js samouczek — zrzut ekranu witryny Azure Portal przedstawiający konto usługi Azure Cosmos DB z wyróżnioną nazwą kolekcji — baza danych Node

  7. Zauważ również, że każdy obiekt ma jeszcze jeden atrybut o nazwie __type, który pomaga rozróżnić te dwa różne modele obiektów.

  8. Na koniec spróbujmy odczytać dane przechowywane w usłudze Azure Cosmos DB. Platforma Mongoose dba o odpowiednie filtrowanie danych na podstawie modelu. Podczas odczytywania danych nie trzeba robić niczego więcej. Wystarczy tylko określić model (w tym przypadku Family_common), a platforma Mongoose zajmie się filtrowaniem według klucza „DiscriminatorKey”.

    Family_common.find({ 'children.gender' : "male"}, function(err, foundFamily){
        foundFamily.forEach(fam => console.log("Found Family (using discriminator): " + JSON.stringify(fam)));
    });
    

Jak widać, praca z dyskryminatorami platformy Mongoose jest prosta. Dlatego jeśli masz aplikację korzystającą z platformy Mongoose, ten samouczek jest sposobem na uruchomienie aplikacji przy użyciu interfejsu API usługi Azure Cosmos DB dla bazy danych MongoDB bez konieczności wprowadzania zbyt wielu zmian.

Czyszczenie zasobów

Po zakończeniu pracy z aplikacją i kontem usługi Azure Cosmos DB możesz usunąć utworzone zasoby platformy Azure, aby nie ponosić dodatkowych opłat. Aby usunąć zasoby:

  1. Na pasku wyszukiwania w witrynie Azure Portal wyszukaj i wybierz pozycję Grupy zasobów.

  2. Z listy wybierz grupę zasobów utworzoną na potrzeby tego przewodnika Szybki start.

    Wybierz grupę zasobów do usunięcia

  3. Na stronie Przegląd grupy zasobów wybierz pozycję Usuń grupę zasobów.

    Usuwanie grupy zasobów

  4. W następnym oknie wprowadź nazwę grupy zasobów do usunięcia, a następnie wybierz pozycję Usuń.

Następne kroki