Hızlı Başlangıç: MongoDB sürücüsü ile Python için MongoDB için Azure Cosmos DB
ŞUNLAR IÇIN GEÇERLIDIR: MongoDB
Azure Cosmos DB kaynağınızda veritabanları, koleksiyonlar ve belgeler oluşturmak için PyMongo paketini kullanmaya başlayın. Paketi yüklemek için bu adımları izleyin ve temel görevler için örnek kodu deneyin.
Dekont
Örnek kod parçacıkları GitHub'da Python projesi olarak kullanılabilir.
Bu hızlı başlangıçta, Python , PyMongo için açık kaynak MongoDB istemci sürücülerinden birini kullanarak MongoDB için Azure Cosmos DB API'si ile iletişim kuracaksınız. Ayrıca, Azure Cosmos DB kapasite modeline özgü veritabanı kaynaklarını oluşturmanıza ve almanıza yardımcı olmak için tasarlanmış MongoDB uzantısı komutlarını kullanacaksınız.
Önkoşullar
- Etkin aboneliği olan bir Azure hesabı. Ücretsiz hesap oluşturun.
- Python 3.8+
- Azure Komut Satırı Arabirimi (CLI) veya Azure PowerShell
Önkoşul denetimi
- Terminalde veya komut penceresinde komutunu çalıştırarak
python --version
Python'ın son sürümüne sahip olup olmadığınızı denetleyin. - Uygun Azure komut satırı araçlarının yüklü olup olmadığını denetlemek için (Azure CLI) veya
Get-Module -ListAvailable Az*
(Azure PowerShell) komutunu çalıştırınaz --version
.
Ayarlama
Bu bölümde, Azure Cosmos DB hesabı oluşturma ve MongoDB npm paketini kullanan bir proje ayarlama adımlarında size yol gösterilir.
Azure Cosmos DB hesabı oluşturma
Bu hızlı başlangıçta MongoDB API'sini kullanarak tek bir Azure Cosmos DB hesabı oluşturulacaktır.
accountName, resourceGroupName ve location için kabuk değişkenleri oluşturun.
# Variable for resource group name resourceGroupName="msdocs-cosmos-quickstart-rg" location="westus" # Variable for account name with a randomnly generated suffix let suffix=$RANDOM*$RANDOM accountName="msdocs-$suffix"
Henüz yapmadıysanız komutunu kullanarak
az login
Azure CLI'da oturum açın.az group create
Aboneliğinizde yeni bir kaynak grubu oluşturmak için komutunu kullanın.az group create \ --name $resourceGroupName \ --location $location
az cosmosdb create
MongoDB için varsayılan ayarlarla yeni bir Azure Cosmos DB hesabı oluşturmak için komutunu kullanın.az cosmosdb create \ --resource-group $resourceGroupName \ --name $accountName \ --locations regionName=$location --kind MongoDB
MongoDB bağlantı dizesini alma
Komutuyla hesabın bağlantı dizesi listesinden MongoDB bağlantı dizesi API'sini
az cosmosdb keys list
bulun.az cosmosdb keys list --type connection-strings \ --resource-group $resourceGroupName \ --name $accountName
BİRİnCİl ANAHTAR değerlerini kaydedin. Bu kimlik bilgilerini daha sonra kullanacaksınız.
Yeni python uygulaması oluşturma
Tercih ettiğiniz terminali kullanarak yeni bir boş klasör oluşturun ve dizini klasör olarak değiştirin.
Dekont
Yalnızca tamamlanmış kodu istiyorsanız, tam örneği içeren örnek kod parçacıkları depoyu indirin veya çatallayın ve kopyalayın. Azure Cloud Shell'deki depoyu da
git clone
kullanarak bu hızlı başlangıçta gösterilen adımları izleyebilirsiniz.PyMongo ve python-dotenv paketlerini listeleyen bir requirements.txt dosyası oluşturun.
# requirements.txt pymongo python-dotenv
Sanal bir ortam oluşturun ve paketleri yükleyin.
# 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
Ortam değişkenlerini yapılandırma
Kodunuzda CONNECTION STRING değerlerini kullanmak için bu değeri uygulamayı çalıştıran yerel ortamda ayarlayın. Ortam değişkenini ayarlamak için tercih ettiğiniz terminali kullanarak aşağıdaki komutları çalıştırın:
$env:COSMOS_CONNECTION_STRING = "<cosmos-connection-string>"
Nesne modeli
Şimdi MongoDB için API'deki kaynak hiyerarşisine ve bu kaynakları oluşturmak ve bunlara erişmek için kullanılan nesne modeline göz atalım. Azure Cosmos DB, hesaplar, veritabanları, koleksiyonlar ve belgelerden oluşan bir hiyerarşide kaynaklar oluşturur.
En üstte bir Azure Cosmos DB hesabını gösteren hiyerarşik diyagram. Hesapta iki alt veritabanı parçası vardır. Veritabanı parçalarından biri iki alt koleksiyon parçası içerir. Diğer veritabanı parçası tek bir alt koleksiyon parçası içerir. Bu tek koleksiyon parçası üç alt belge parçasına sahiptir.
Her kaynak türü bir Python sınıfıyla temsil edilir. En yaygın sınıflar şunlardır:
MongoClient - PyMongo ile çalışırken ilk adım, MongoDB için Azure Cosmos DB API'sine bağlanmak üzere bir MongoClient oluşturmaktır. İstemci nesnesi, hizmette istekleri yapılandırmak ve yürütmek için kullanılır.
Veritabanı - MongoDB için Azure Cosmos DB API'si bir veya daha fazla bağımsız veritabanını destekleyebilir.
Koleksiyon - Bir veritabanı bir veya daha fazla koleksiyon içerebilir. Koleksiyon, MongoDB'de depolanan bir belge grubudur ve kabaca ilişkisel veritabanındaki bir tablonun eşdeğeri olarak düşünülebilir.
Belge - Belge, anahtar-değer çiftleri kümesidir. Belgelerin dinamik şeması vardır. Dinamik şema, aynı koleksiyondaki belgelerin aynı alan veya yapı kümesine sahip olması gerekmeyecek anlamına gelir. Ayrıca bir koleksiyonun belgelerindeki ortak alanlar farklı veri türlerini barındırabilir.
Varlıkların hiyerarşisi hakkında daha fazla bilgi edinmek için Azure Cosmos DB kaynak modeli makalesine bakın.
Kod örnekleri
- İstemcinin kimliğini doğrulama
- Veritabanı alma
- Koleksiyon alma
- Dizin oluşturma
- Belge oluşturma
- Belge alma
- Belgeleri sorgulama
Bu makalede açıklanan örnek kod adlı bir koleksiyonla adlı adventureworks
products
bir veritabanı oluşturur. Koleksiyon products
ad, kategori, miktar ve satış göstergesi gibi ürün ayrıntılarını içerecek şekilde tasarlanmıştır. Her ürün benzersiz bir tanımlayıcı da içerir. Örnek kodun tamamı konumundadır https://github.com/Azure-Samples/azure-cosmos-db-mongodb-python-getting-started/tree/main/001-quickstart/.
Aşağıdaki adımlar için veritabanı parçalama kullanmaz ve PyMongo sürücüsünü kullanan zaman uyumlu bir uygulama gösterir. Zaman uyumsuz uygulamalar için Motor sürücüsünü kullanın.
İstemcinin kimliğini doğrulama
Proje dizininde bir run.py dosyası oluşturun. Düzenleyicinizde, PyMongo ve python-dotenv paketleri de dahil olmak üzere kullanacağınız paketlere başvurmak için require deyimleri ekleyin.
import os import sys from random import randint import pymongo from dotenv import load_dotenv
Bir .env dosyasında tanımlanan ortam değişkeninden bağlantı bilgilerini alın.
load_dotenv() CONNECTION_STRING = os.environ.get("COSMOS_CONNECTION_STRING")
Kodda kullanacağınız sabitleri tanımlayın.
DB_NAME = "adventureworks" COLLECTION_NAME = "products"
MongoDB için Azure Cosmos DB API'sine Bağlan
MongoDB için Azure Cosmos DB kaynağınıza bağlanmak için MongoClient nesnesini kullanın. connect yöntemi veritabanına bir başvuru döndürür.
client = pymongo.MongoClient(CONNECTION_STRING)
Veritabanı alma
Veritabanının list_database_names yöntemiyle var olup olmadığını denetleyin. Veritabanı yoksa, veritabanı uzantısını oluştur komutunu kullanarak belirtilen sağlanan aktarım hızıyla oluşturun.
# 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))
Koleksiyon alma
Koleksiyonun list_collection_names yöntemiyle var olup olmadığını denetleyin. Koleksiyon yoksa, oluşturmak için create collection extension komutunu kullanın.
# 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))
Dizin oluşturma
Güncelleştirme koleksiyonu uzantısı komutunu kullanarak bir dizin oluşturun. Dizini koleksiyon uzantısı oluştur komutunda da ayarlayabilirsiniz. Daha sonra ürün adında imleç sınıfı sıralama yöntemiyle sıralama yapmak için bu örnekte dizini name
özelliğine ayarlayın.
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())))
Belge oluşturma
Veritabanının ürün özelliklerine adventureworks
sahip bir belge oluşturun:
- Kategori özelliği. Bu özellik mantıksal bölüm anahtarı olarak kullanılabilir.
- Ad özelliği.
- Stok miktarı özelliği.
- Ürünün satışta olup olmadığını gösteren bir satış özelliği.
"""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))
Koleksiyon düzeyi işlemini update_one çağırarak koleksiyonda bir belge oluşturun. Bu örnekte, yeni bir belge oluşturmak yerine upsert ekleyeceksiniz. Ürün adı rastgele olduğundan bu örnekte Upsert gerekli değildir. Ancak, kodu birden çok kez çalıştırmanız ve ürün adının aynı olması durumunda upsert uygulamak iyi bir uygulamadır.
İşlemin update_one
sonucu, sonraki işlemlerde kullanabileceğiniz alan değerini içerir _id
. _id özelliği otomatik olarak oluşturuldu.
Belge alma
Belge almak için find_one yöntemini kullanın.
doc = collection.find_one({"_id": result.upserted_id})
print("Found a document with _id {}: {}\n".format(result.upserted_id, doc))
Azure Cosmos DB'de hem benzersiz tanımlayıcıyı (_id
) hem de bölüm anahtarını kullanarak daha ucuz bir nokta okuma işlemi gerçekleştirebilirsiniz.
Belgeleri sorgulama
Belge ekledikten sonra, belirli bir filtreyle eşleşen tüm belgeleri almak için bir sorgu çalıştırabilirsiniz. Bu örnek, belirli bir kategoriyle eşleşen tüm belgeleri bulur: gear-surf-surfboards
. Sorgu tanımlandıktan sonra bir sonuç almak için çağrısı Collection.find
yapın ve sıralamayı kullanın.Cursor
"""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))
Sorun Giderme:
- gibi
The index path corresponding to the specified order-by item is excluded.
bir hata alırsanız dizini oluşturduğunuzdan emin olun.
Kodu çalıştırma
Bu uygulama MongoDB veritabanı ve koleksiyonu için bir API oluşturur, bir belge oluşturur ve ardından tam olarak aynı belgeyi okur. Son olarak, örnek belirtilen bir ürün kategorisiyle eşleşen belgeleri döndüren bir sorgu verir. Her adımda örnek, konsola gerçekleştirdiği adımlarla ilgili bilgiler gönderir.
Uygulamayı çalıştırmak için bir terminal kullanarak uygulama dizinine gidin ve uygulamayı çalıştırın.
python run.py
Uygulamanın çıkışı şu örneğe benzer olmalıdır:
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}
Kaynakları temizleme
NoSQL için Azure Cosmos DB hesabına artık ihtiyacınız kalmadığında ilgili kaynak grubunu silebilirsiniz.
az group delete
Kaynak grubunu silmek için komutunu kullanın.
az group delete --name $resourceGroupName