Megosztás a következőn keresztül:


Rövid útmutató: A MongoDB-hez készült Azure Cosmos DB Pythonhoz MongoDB-illesztőprogrammal

A KÖVETKEZŐKRE VONATKOZIK: MongoDB

Ismerkedjen meg a MongoDB-vel, hogy adatbázisokat, gyűjteményeket és dokumentumokat hozzon létre az Azure Cosmos DB-erőforrásban. Az alábbi lépéseket követve üzembe helyezhet egy minimális megoldást a környezetében az Azure Developer CLI használatával.

A MongoDB-hez készült API referenciadokumentációja– Pymongo-csomag | – Azure Developer CLI |

Előfeltételek

Beállítás

Helyezze üzembe a projekt fejlesztési tárolóját a környezetében. Ezután az Azure Developer CLI (azd) használatával hozzon létre egy Azure Cosmos DB-fiókot MongoDB-fiókhoz, és helyezzen üzembe egy tárolóalapú mintaalkalmazást. A mintaalkalmazás az ügyfélkódtárat használja a mintaadatok kezelésére, létrehozására, olvasására és lekérdezésére.

Megnyitás a GitHub Codespacesben

Megnyitás a Dev Containerben

Fontos

A GitHub-fiókok magukban foglalják a tárterületre és az alapórákra való jogosultságot díjmentesen. További információkért tekintse meg a GitHub-fiókokhoz tartozó tárterületet és alapórákat.

  1. Nyisson meg egy terminált a projekt gyökérkönyvtárában.

  2. Hitelesítés az Azure Developer CLI-vel azd auth logina . Kövesse az eszköz által megadott lépéseket a parancssori felületre való hitelesítéshez az ön által előnyben részesített Azure-hitelesítő adatokkal.

    azd auth login
    
  3. A projekt inicializálására használható azd init .

    azd init --template cosmos-db-mongodb-python-quickstart
    

    Feljegyzés

    Ez a rövid útmutató az azure-samples/cosmos-db-mongodb-python-quickstart sablon GitHub-adattárat használja. Az Azure Developer CLI automatikusan klónozza ezt a projektet a gépére, ha még nincs ott.

  4. Az inicializálás során konfiguráljon egy egyedi környezetnevet.

    Tipp.

    A rendszer a környezet nevét is használja a célerőforráscsoport neveként. Ebben a rövid útmutatóban fontolja meg a használatát msdocs-cosmos-db.

  5. Az Azure Cosmos DB-fiók üzembe helyezése a következő használatával azd up: . A Bicep-sablonok egy minta webalkalmazást is üzembe helyeznek.

    azd up
    
  6. A kiépítési folyamat során válassza ki az előfizetést és a kívánt helyet. Várja meg, amíg a kiépítési folyamat befejeződik. A folyamat körülbelül öt percet vehet igénybe.

  7. Az Azure-erőforrások kiépítése után a kimenet tartalmazza a futó webalkalmazás URL-címét.

    Deploying services (azd deploy)
    
      (✓) Done: Deploying service web
    - Endpoint: <https://[container-app-sub-domain].azurecontainerapps.io>
    
    SUCCESS: Your application was provisioned and deployed to Azure in 5 minutes 0 seconds.
    
  8. A konzol URL-címével keresse meg a webalkalmazást a böngészőben. Figyelje meg a futó alkalmazás kimenetét.

    Képernyőkép a futó webalkalmazásról.


Telepítse az ügyfélkódtárat

  1. Hozzon létre egy requirements.txt fájlt az alkalmazáskönyvtárban, amely felsorolja a PyMongo- és python-dotenv-csomagokat.

    # requirements.txt
    pymongo
    python-dotenv
    
  2. Hozzon létre egy virtuális környezetet, és telepítse a csomagokat.

    # py -3 uses the global python interpreter. You can also use python3 -m venv .venv.
    py -3 -m venv .venv
    source .venv/Scripts/activate   
    pip install -r requirements.txt
    

Objektummodell

Tekintsük át a MongoDB API-ban található erőforrások hierarchiáját és az erőforrások létrehozásához és eléréséhez használt objektummodellt. Az Azure Cosmos DB olyan hierarchiában hoz létre erőforrásokat, amelyek fiókokból, adatbázisokból, gyűjteményekből és dokumentumokból állnak.

Az Azure Cosmos DB-hierarchia diagramja, beleértve a fiókokat, adatbázisokat, gyűjteményeket és dokumentumokat.

Hierarchikus diagram egy Azure Cosmos DB-fiókot ábrázol felül. A fiók két gyermekadatbázis-szegmensből áll. Az adatbázis-szegmensek egyike két gyermekgyűjteményi szegmenst tartalmaz. A másik adatbázis-szegmens egyetlen gyermekgyűjteményi szegmenst tartalmaz. Az egyetlen gyűjtemény szegmense három gyermek-dokumentum-szegmensből áll.

Minden erőforrástípust egy Python-osztály jelöl. Íme a leggyakoribb osztályok:

  • MongoClient – A PyMongo használatakor az első lépés egy MongoClient létrehozása az Azure Cosmos DB MongoDB-hez készült API-jához való csatlakozáshoz. Az ügyfélobjektum a szolgáltatással kapcsolatos kérések konfigurálására és végrehajtására szolgál.

  • Adatbázis – Az Azure Cosmos DB Api for MongoDB egy vagy több független adatbázist támogat.

  • Gyűjtemény – Egy adatbázis egy vagy több gyűjteményt tartalmazhat. A gyűjtemény a MongoDB-ben tárolt dokumentumok csoportja, és nagyjából egyenértékűnek tekinthető egy relációs adatbázisban lévő táblázattal.

  • Dokumentum – A dokumentum kulcs-érték párok készlete. A dokumentumok dinamikus sémával rendelkeznek. A dinamikus séma azt jelenti, hogy az ugyanabban a gyűjteményben lévő dokumentumoknak nem kell ugyanazokkal a mezőkkel vagy szerkezettel rendelkezniük. A gyűjtemény dokumentumainak gyakori mezői pedig különböző típusú adatokat tartalmazhatnak.

Az entitások hierarchiájáról további információt az Azure Cosmos DB erőforrásmodell-cikkében talál.

Kódpéldák

A cikkben ismertetett mintakód létrehoz egy adatbázist, amelynek neve adventureworks productsegy . A products gyűjtemény olyan termékadatokat tartalmaz, mint a név, a kategória, a mennyiség és az értékesítési mutató. Minden termék egyedi azonosítót is tartalmaz. A teljes mintakód a következő helyen https://github.com/Azure-Samples/azure-cosmos-db-mongodb-python-getting-started/tree/main/001-quickstart/található: .

Az alábbi lépéseknél az adatbázis nem fog horizontális skálázást használni, és egy szinkron alkalmazást jelenít meg a PyMongo-illesztőprogram használatával. Aszinkron alkalmazásokhoz használja a motorillesztőt.

Az ügyfél hitelesítése

  1. A projektkönyvtárban hozzon létre egy run.py fájlt. A szerkesztőben adjon meg kötelező utasításokat a használni kívánt csomagokra való hivatkozáshoz, beleértve a PyMongo és a Python-dotenv csomagokat is.

    import os
    import sys
    from random import randint
    
    import pymongo
    from dotenv import load_dotenv
    
  2. Kérje le a kapcsolati adatokat egy .env fájlban definiált környezeti változóból.

    load_dotenv()
    CONNECTION_STRING = os.environ.get("COSMOS_CONNECTION_STRING")
    
  3. Határozza meg a kódban használni kívánt állandókat.

    DB_NAME = "adventureworks"
    COLLECTION_NAME = "products"
    

Csatlakozás az Azure Cosmos DB MongoDB-hez készült API-jához

A MongoClient objektum használatával csatlakozzon a MongoDB-hez készült Azure Cosmos DB-erőforráshoz. A kapcsolódási módszer az adatbázisra mutató hivatkozást ad vissza.

client = pymongo.MongoClient(CONNECTION_STRING)

Adatbázis lekérése

Ellenőrizze, hogy az adatbázis létezik-e list_database_names metódussal. Ha az adatbázis nem létezik, az adatbázisbővítmény létrehozása paranccsal hozza létre egy megadott kiosztott átviteli sebességgel.

# Create database if it doesn't exist
db = client[DB_NAME]
if DB_NAME not in client.list_database_names():
    # Create a database with 400 RU throughput that can be shared across
    # the DB's collections
    db.command({"customAction": "CreateDatabase", "offerThroughput": 400})
    print("Created db '{}' with shared throughput.\n".format(DB_NAME))
else:
    print("Using database: '{}'.\n".format(DB_NAME))

Gyűjtemény lekérése

Ellenőrizze, hogy a gyűjtemény létezik-e a list_collection_names metódussal. Ha a gyűjtemény nem létezik, a gyűjteménybővítmény létrehozása paranccsal hozza létre.

# Create collection if it doesn't exist
collection = db[COLLECTION_NAME]
if COLLECTION_NAME not in db.list_collection_names():
    # Creates a unsharded collection that uses the DBs shared throughput
    db.command(
        {"customAction": "CreateCollection", "collection": COLLECTION_NAME}
    )
    print("Created collection '{}'.\n".format(COLLECTION_NAME))
else:
    print("Using collection: '{}'.\n".format(COLLECTION_NAME))

Index létrehozása

Hozzon létre egy indexet a frissítésgyűjtemény bővítmény parancsával. Az indexet a gyűjteménybővítmény létrehozása parancsban is beállíthatja. Állítsa be az index tulajdonságát name ebben a példában, hogy később a kurzorosztály rendezési módszerével rendezhesse a termék nevét.

indexes = [
    {"key": {"_id": 1}, "name": "_id_1"},
    {"key": {"name": 2}, "name": "_id_2"},
]
db.command(
    {
        "customAction": "UpdateCollection",
        "collection": COLLECTION_NAME,
        "indexes": indexes,
    }
)
print("Indexes are: {}\n".format(sorted(collection.index_information())))

Dokumentum létrehozása

Hozzon létre egy dokumentumot az adatbázis terméktulajdonságaivaladventureworks:

  • Kategóriatulajdonság. Ez a tulajdonság használható logikai partíciókulcsként.
  • Névtulajdonság.
  • Készletmennyiség tulajdonság.
  • Eladó ingatlan, amely jelzi, hogy a termék eladásra kerül-e.
"""Create new document and upsert (create or replace) to collection"""
product = {
    "category": "gear-surf-surfboards",
    "name": "Yamba Surfboard-{}".format(randint(50, 5000)),
    "quantity": 1,
    "sale": False,
}
result = collection.update_one(
    {"name": product["name"]}, {"$set": product}, upsert=True
)
print("Upserted document with _id {}\n".format(result.upserted_id))

Hozzon létre egy dokumentumot a gyűjteményben a gyűjteményszintű művelet update_one meghívásával. Ebben a példában nem új dokumentumot, hanem új dokumentumot fog létrehozni. Ebben a példában az Upsert nem szükséges, mert a termék neve véletlenszerű. Célszerű azonban a kódot többször is futtatni, és a termék neve megegyezik.

A művelet eredménye update_one tartalmazza a _id későbbi műveletekhez használható mezőértéket. A _id tulajdonság automatikusan létre lett hozva.

Dokumentum lekérése

Dokumentum lekéréséhez használja a find_one metódust.

doc = collection.find_one({"_id": result.upserted_id})
print("Found a document with _id {}: {}\n".format(result.upserted_id, doc))

Az Azure Cosmos DB-ben az egyedi azonosító (_id) és a partíciókulcs használatával kevésbé költséges pontolvasási műveletet hajthat végre.

Dokumentumok lekérdezése

Miután beszúrt egy dokumentumot, egy lekérdezést futtatva lekérheti az adott szűrőnek megfelelő összes dokumentumot. Ez a példa megkeresi az összes dokumentumot, amely megfelel egy adott kategóriának: gear-surf-surfboards. A lekérdezés definiálása után hívja Collection.find meg az eredmény lekérését Cursor , majd használja a rendezést.

"""Query for documents in the collection"""
print("Products with category 'gear-surf-surfboards':\n")
allProductsQuery = {"category": "gear-surf-surfboards"}
for doc in collection.find(allProductsQuery).sort(
    "name", pymongo.ASCENDING
):
    print("Found a product with _id {}: {}\n".format(doc["_id"], doc))

Hibaelhárítás:

  • Ha például The index path corresponding to the specified order-by item is excluded.hibaüzenetet kap, győződjön meg arról, hogy létrehozta az indexet.

A kód futtatása

Ez az alkalmazás létrehoz egy API-t a MongoDB-adatbázishoz és -gyűjteményhez, és létrehoz egy dokumentumot, majd pontosan ugyanazt a dokumentumot olvassa vissza. Végül a példa egy lekérdezést ad vissza, amely egy adott termékkategóriának megfelelő dokumentumokat ad vissza. A példa minden lépéssel adatokat ad ki a konzolnak az elvégzett lépésekről.

Az alkalmazás futtatásához egy terminál használatával lépjen az alkalmazás könyvtárára, és futtassa az alkalmazást.

python run.py

Az alkalmazás kimenetének az alábbi példához hasonlónak kell lennie:


Created db 'adventureworks' with shared throughput.

Created collection 'products'.

Indexes are: ['_id_', 'name_1']

Upserted document with _id <ID>

Found a document with _id <ID>:
{'_id': <ID>,
'category': 'gear-surf-surfboards',
'name': 'Yamba Surfboard-50',
'quantity': 1,
'sale': False}

Products with category 'gear-surf-surfboards':

Found a product with _id <ID>:
{'_id': ObjectId('<ID>'),
'name': 'Yamba Surfboard-386',
'category': 'gear-surf-surfboards',
'quantity': 1,
'sale': False}

Az erőforrások eltávolítása

Ha már nincs szüksége a NoSQL-hez készült Azure Cosmos DB-fiókra, törölheti a megfelelő erőforráscsoportot.

az group delete Az erőforráscsoport törléséhez használja a parancsot.

az group delete --name $resourceGroupName