JavaScript için Azure Cosmos DB istemci kitaplığı - sürüm 4.2.0
/TypeScript
Derleme Durumu
Azure Cosmos DB, belge, anahtar-değer, geniş sütun ve graf veritabanlarını destekleyen genel olarak dağıtılmış, çok modelli bir veritabanı hizmetidir. Bu paket JavaScript/TypeScript uygulamalarının SQL API veritabanları ve içerdikleri JSON belgeleriyle etkileşim kurmasına yöneliktir:
- Cosmos DB veritabanları oluşturma ve ayarlarını değiştirme
- JSON belge koleksiyonlarını depolamak için kapsayıcı oluşturma ve değiştirme
- Kapsayıcılarınızdaki öğeleri (JSON belgeleri) oluşturma, okuma, güncelleştirme ve silme
- SQL benzeri söz dizimini kullanarak veritabanınızdaki belgeleri sorgulama
Önemli bağlantılar:
Başlarken
Önkoşullar
Azure Aboneliği ve Cosmos DB SQL API Hesabı
Bu paketi kullanmak için bir Azure Aboneliğive bir Cosmos DB hesabı (SQL API) olmalıdır.
Cosmos DB SQL API hesabına ihtiyacınız varsa, şu Azure CLI komutuyla bir hesap oluşturmak için Azure Cloud Shell kullanabilirsiniz:
az cosmosdb create --resource-group <resource-group-name> --name <cosmos-database-account-name>
İsterseniz azure portal
NodeJS
Bu paket, bir LTS sürümü kullanılarak NodeJS önceden yüklenmiş olarak gelen npm aracılığıyla dağıtılır.
CORS
Tarayıcılar için geliştirmeniz gerekiyorsa Cosmos DB hesabınız için Çıkış Noktaları Arası Kaynak Paylaşımı (CORS) kuralları ayarlamanız gerekir. Cosmos DB'niz için yeni CORS kuralları oluşturmak için bağlantılı belgedeki yönergeleri izleyin.
Bu paketi yükle
npm install @azure/cosmos
Hesap Kimlik Bilgilerini Alma
Cosmos DB Hesap Uç Noktası ve Anahtargerekir. Bunları
az cosmosdb show --resource-group <your-resource-group> --name <your-account-name> --query documentEndpoint --output tsv
az cosmosdb keys list --resource-group <your-resource-group> --name <your-account-name> --query primaryMasterKey --output tsv
CosmosClient
örneği oluşturma
Cosmos DB ile etkileşim, CosmosClient sınıfının bir örneğiyle başlar
const { CosmosClient } = require("@azure/cosmos");
const endpoint = "https://your-account.documents.azure.com";
const key = "<database account masterkey>";
const client = new CosmosClient({ endpoint, key });
async function main() {
// The rest of the README samples are designed to be pasted into this function body
}
main().catch((error) => {
console.error(error);
});
Kolaylık olması için key
ve endpoint
doğrudan koda dahil ettik, ancak bunları dotenv veya ortam değişkenlerinden yükleme gibi bir proje kullanarak kaynak denetiminde olmayan bir dosyadan yüklemek isteyebilirsiniz
Üretim ortamlarında anahtarlar gibi gizli diziler Azure Key Vault'ta depolanmalıdır
Temel kavramlar
bir CosmosClientbaşlatıldıktan sonra, Cosmos DB'deki birincil kaynak türleriyle etkileşim kurabilirsiniz:
Veritabanı: Cosmos DB hesabı birden çok veritabanı içerebilir. Veritabanı oluştururken, belgeleriyle etkileşim kurarken kullanmak istediğiniz API'yi belirtirsiniz: SQL, MongoDB, Gremlin, Cassandra veya Azure Tablosu. kapsayıcılarını yönetmek için Veritabanı nesnesini kullanın.
Container: Kapsayıcı, JSON belgelerinin koleksiyonudur. Container nesnesindeki yöntemleri kullanarak kapsayıcıdaki öğeleri oluşturur (ekler), okur, güncelleştirir ve silersiniz.
Öğe: Öğe, kapsayıcıda depolanan bir JSON belgesidir. Her Öğe, kapsayıcı içindeki öğeyi benzersiz olarak tanımlayan bir değere sahip bir
id
anahtarı içermelidir.id
sağlamazsanız SDK otomatik olarak bir tane oluşturur.
Bu kaynaklar hakkında daha fazla bilgi için bkz. Azure Cosmos veritabanları, kapsayıcıları ve öğeleriyle çalışma.
Örnekler
Aşağıdaki bölümlerde, en yaygın Cosmos DB görevlerinden bazılarını kapsayan çeşitli kod parçacıkları sağlanır:
- Veritabanı oluşturma
- Kapsayıcı oluşturma
- Bölüm Anahtarları Kullanarak
- Öğe ekleme
- Belgeleri sorgulama
- Öğe okuma
- Öğe silme
- Hiyerarşik bölüm anahtarı kapsayıcıda CRUD
Veritabanı oluşturma
CosmosClientkimliğini doğruladıktan sonra hesaptaki herhangi bir kaynakla çalışabilirsiniz. Aşağıdaki kod parçacığı bir NOSQL API veritabanı oluşturur.
const { database } = await client.databases.createIfNotExists({ id: "Test Database" });
console.log(database.id);
Kapsayıcı oluşturma
Bu örnek, varsayılan ayarlarla bir kapsayıcı oluşturur
const { container } = await database.containers.createIfNotExists({ id: "Test Database" });
console.log(container.id);
Bölüm Anahtarlarını Kullanma
Bu örnekte desteklenen çeşitli bölüm Anahtarları türleri gösterilmektedir.
await container.item("id", "1").read(); // string type
await container.item("id", 2).read(); // number type
await container.item("id", true).read(); // boolean type
await container.item("id", {}).read(); // None type
await container.item("id", undefined).read(); // None type
await container.item("id", null).read(); // null type
Bölüm Anahtarı tek bir değerden oluşuyorsa, sabit değer veya dizi olarak sağlanabilir.
await container.item("id", "1").read();
await container.item("id", ["1"]).read();
Bölüm Anahtarı birden fazla değerden oluşuyorsa, dizi olarak sağlanmalıdır.
await container.item("id", ["a", "b"]).read();
await container.item("id", ["a", 2]).read();
await container.item("id", [{}, {}]).read();
await container.item("id", ["a", {}]).read();
await container.item("id", [2, null]).read();
Öğe ekleme
Kapsayıcıya öğe eklemek için verilerinizi içeren bir nesneyi Items.upsertgeçirin. Azure Cosmos DB hizmetinde her öğenin bir id
anahtarı olması gerekir. Sağlamazsanız SDK otomatik olarak bir id
oluşturur.
Bu örnek kapsayıcıya birkaç öğe ekler
const cities = [
{ id: "1", name: "Olympia", state: "WA", isCapitol: true },
{ id: "2", name: "Redmond", state: "WA", isCapitol: false },
{ id: "3", name: "Chicago", state: "IL", isCapitol: false }
];
for (const city of cities) {
await container.items.create(city);
}
Öğe okuma
Kapsayıcıdan tek bir öğeyi okumak için Item.readkullanın. Bu, id
tarafından sorgulamak için SQL kullanmaktan daha ucuz bir işlemdir.
await container.item("1", "1").read();
Hiyerarşik bölüm anahtarıyla Kapsayıcı üzerinde CRUD
Hiyerarşik bölüm anahtarıyla Kapsayıcı oluşturma
const containerDefinition = {
id: "Test Database",
partitionKey: {
paths: ["/name", "/address/zip"],
version: PartitionKeyDefinitionVersion.V2,
kind: PartitionKeyKind.MultiHash,
},
}
const { container } = await database.containers.createIfNotExists(containerDefinition);
console.log(container.id);
- ["/name", "/address/zip"]
olarak tanımlanan hiyerarşik bölüm anahtarına sahip bir öğe ekleme
const item = {
id: "1",
name: 'foo',
address: {
zip: 100
},
active: true
}
await container.items.create(item);
Hiyerarşik bölüm anahtarı olarak tanımlanan bir kapsayıcıdan tek bir öğeyi okumak için - ["/name", "/address/zip"],
await container.item("1", ["foo", 100]).read();
Hiyerarşik bölüm anahtarıyla bir öğeyi hiyerarşik bölüm anahtarıyla sorgulama - ["/name", "/address/zip"],
const { resources } = await container.items
.query("SELECT * from c WHERE c.active = true", {
partitionKey: ["foo", 100],
})
.fetchAll();
for (const item of resources) {
console.log(`${item.name}, ${item.address.zip} `);
}
Öğe silme
Kapsayıcıdaki öğeleri silmek için Item.deletekullanın.
// Delete the first item returned by the query above
await container.item("1").delete();
Veritabanını sorgulama
Cosmos DB SQL API veritabanı, SQL benzeri söz dizimini kullanarak Items.query ile kapsayıcıdaki öğelerin sorgulanmasını destekler:
const { resources } = await container.items
.query("SELECT * from c WHERE c.isCapitol = true")
.fetchAll();
for (const city of resources) {
console.log(`${city.name}, ${city.state} is a capitol `);
}
Parametreleri ve değerlerini içeren bir nesneyi Items.querygeçirerek parametreli sorgular gerçekleştirin:
const { resources } = await container.items
.query({
query: "SELECT * from c WHERE c.isCapitol = @isCapitol",
parameters: [{ name: "@isCapitol", value: true }]
})
.fetchAll();
for (const city of resources) {
console.log(`${city.name}, ${city.state} is a capitol `);
}
SQL API'sini kullanarak Cosmos DB veritabanlarını sorgulama hakkında daha fazla bilgi için bkz. Azure Cosmos DB verilerini SQL sorguları ile sorgulama.
Değişiklik Akışı Çekme Modeli
Değişiklik akışı bir bölüm anahtarı, akış aralığı veya kapsayıcının tamamı için getirilebilir.
Değişiklik akışını işlemek için bir ChangeFeedPullModelIterator
örneği oluşturun. başlangıçta ChangeFeedPullModelIterator
oluşturduğunuzda, ChangeFeedIteratorOptions
içinde hem değişiklikleri okumak için başlangıç konumunu hem de değişikliklerin getirileceği kaynağı (bölüm anahtarı veya FeedRange) içeren gerekli bir changeFeedStartFrom
değeri belirtmeniz gerekir. sayfa başına alınan en fazla öğe sayısını ayarlamak için isteğe bağlı olarak ChangeFeedIteratorOptions
maxItemCount
kullanabilirsiniz.
Not: changeFeedStartFrom
değeri belirtilmezse, şimdi() kapsayıcının tamamı için değişiklik akışı getirilir.
Değişiklik akışı için dört başlangıç konumu vardır:
Beginning
// Signals the iterator to read changefeed from the beginning of time.
const options = {
changeFeedStartFrom: ChangeFeedStartFrom.Beginning(),
};
const iterator = container.getChangeFeedIterator(options);
Time
// Signals the iterator to read changefeed from a particular point of time.
const time = new Date("2023/09/11"); // some sample date
const options = {
changeFeedStartFrom: ChangeFeedStartFrom.Time(time),
};
Now
// Signals the iterator to read changefeed from this moment onward.
const options = {
changeFeedStartFrom: ChangeFeedStartFrom.Now(),
};
Continuation
// Signals the iterator to read changefeed from a saved point.
const continuationToken = "some continuation token recieved from previous request";
const options = {
changeFeedStartFrom: ChangeFeedStartFrom.Continuation(continuationToken),
};
Aşağıda bölüm anahtarı için değişiklik akışını getirme örneği verilmiştir
const partitionKey = "some-partition-Key-value";
const options = {
changeFeedStartFrom: ChangeFeedStartFrom.Beginning(partitionKey),
};
const iterator = container.items.getChangeFeedIterator(options);
while (iterator.hasMoreResults) {
const response = await iterator.readNext();
// process this response
}
Değişiklik akışı, gelecekteki tüm yazma ve güncelleştirmeleri kapsayan sonsuz bir öğe listesi olduğundan, hasMoreResults
değeri her zaman true
. Değişiklik akışını okumaya çalıştığınızda ve kullanılabilir yeni bir değişiklik olmadığında, NotModified
durumuyla bir yanıt alırsınız.
Daha ayrıntılı kullanım yönergeleri ve değişiklik akışı örnekleri burada
Hata İşleme
SDK, bir işlem sırasında oluşabilecek çeşitli hata türleri oluşturur.
- bir işlemin yanıtı =400 >hata kodu döndürürse
ErrorResponse
oluşturulur. - Zaman aşımı nedeniyle Abort dahili olarak çağrılırsa
TimeoutError
oluşturulur. -
AbortError
, durdurma işlemine herhangi bir kullanıcı sinyali geçtiyse oluşturulur. -
RestError
, ağ sorunları nedeniyle temel alınan sistem çağrısının başarısız olması durumunda oluşturulur. - Herhangi bir devDependencies tarafından oluşturulan hatalar. Örneğin,
@azure/identity
paketCredentialUnavailableError
atabilir.
Aşağıda, ErrorResponse
, TimeoutError
, AbortError
ve RestError
tür hatalarını işlemeye yönelik bir örnek verilmiştir.
try {
// some code
} catch (err) {
if (err instanceof ErrorResponse) {
// some specific error handling.
} else if (err instanceof RestError) {
// some specific error handling.
}
// handle other type of errors in similar way.
else {
// for any other error.
}
}
Uygulamanızın herhangi bir hatadan düzgün bir şekilde kurtarılabilmesi ve beklendiği gibi çalışmaya devam etmesini sağlamak için bu hataların düzgün bir şekilde işlenmesi önemlidir. Bu hatalardan bazıları ve olası çözümleri hakkında daha fazla bilgiburada
Sorun giderme
Genel
Hizmet tarafından döndürülen Cosmos DB hatalarıyla etkileşime geçtiğiniz zaman REST API istekleri için döndürülen HTTP durum kodlarıyla aynıdır:
Azure Cosmos DB için HTTP Durum Kodlarını
Çakışma
Örneğin, Cosmos DB veritabanınızda zaten kullanımda olan bir id
kullanarak bir öğe oluşturmaya çalışırsanız, çakışmayı gösteren bir 409
hatası döndürülür. Aşağıdaki kod parçacığında, özel durum yakalanarak ve hata hakkında ek bilgiler görüntülenerek hata düzgün bir şekilde işlenir.
try {
await containers.items.create({ id: "existing-item-id" });
} catch (error) {
if (error.code === 409) {
console.log("There was a conflict with an existing item");
}
}
Çeviri
Azure SDK'ları, ES5 JavaScript söz dizimini ve Node.js
Yeniden denemelerle geçici hataları işleme
Cosmos DB ile çalışırken hizmet tarafından zorlanan
Günlük tutmak
Günlüğe kaydetmeyi etkinleştirmek, hatalarla ilgili yararlı bilgilerin ortaya çıkmasına yardımcı olabilir. HTTP isteklerinin ve yanıtlarının günlüğünü görmek için AZURE_LOG_LEVEL
ortam değişkenini info
olarak ayarlayın. Alternatif olarak, günlük @azure/logger
setLogLevel
çağrılarak çalışma zamanında etkinleştirilebilir.
AZURE_LOG_LEVEL
kullanırken, günlük kitaplığı başlatılmadan önce ayarladığınızdan emin olun.
dotenv
gibi kitaplıklar kullanıyorsanız, kitaplığı günlüğe kaydetmeden önce bu tür kitaplıkların başlatıldığından emin olun.
const { setLogLevel } = require("@azure/logger");
setLogLevel("info");
Günlükleri etkinleştirme hakkında daha ayrıntılı yönergeler için
Tanılama
Cosmos Tanılama özelliği, tüm istemci işlemlerinizle ilgili gelişmiş içgörüler sağlar. Tüm istemci işlemlerinin yanıtına bir CosmosDiagnostics nesnesi eklenir. gibi
- Nokta arama işlemi reponse -
item.read()
,container.create()
,database.delete()
- Sorgu işlemi reponse -
queryIterator.fetchAll()
. - Toplu ve Toplu İşlemler -
item.batch()
. - Hata/Özel durum yanıt nesneleri.
Tüm istemci işlemlerinin yanıtına bir CosmosDiagnostics nesnesi eklenir. 3 Cosmos Tanılama düzeyi, bilgi, hata ayıklama ve hata ayıklama güvenli değildir. Burada yalnızca bilgiler üretim sistemleri için, hata ayıklama ve hata ayıklama güvensiz ise önemli ölçüde daha yüksek kaynaklar kullandığından geliştirme ve hata ayıklama sırasında kullanılmalıdır. Cosmos Tanılama düzeyi 2 şekilde ayarlanabilir
- Programlı olarak
const client = new CosmosClient({ endpoint, key, diagnosticLevel: CosmosDbDiagnosticLevel.debug });
- Ortam değişkenlerini kullanma. (Ortam değişkeni tarafından ayarlanan tanılama düzeyi, istemci seçenekleri aracılığıyla ayarlamaya göre daha yüksek önceliğe sahiptir.)
export AZURE_COSMOSDB_DIAGNOSTICS_LEVEL="debug"
Cosmos Tanılama'nın üç üyesi vardır
ClientSideRequestStatistics Türü: Meta veri aramaları, yeniden denemeler, bağlantı kurulan uç noktalar ve yük boyutu ve süresi gibi istek ve yanıt istatistikleri dahil olmak üzere tanılama ayrıntılarını toplar. (her zaman toplanır, üretim sistemlerinde kullanılabilir.)
DiagnosticNode: Ayrıntılı tanılama bilgilerini yakalayan ağaç benzeri bir yapıdır. Tarayıcılarda bulunan
har
kaydına benzer. Bu özellik varsayılan olarak devre dışıdır ve yalnızca üretim dışı ortamlarda hata ayıklamaya yöneliktir. (tanılama düzeyinde toplanan hata ayıklama ve hata ayıklama-güvenli olmayan)ClientConfig: İstemci başlatma sırasında istemcinin yapılandırma ayarlarıyla ilgili temel bilgileri yakalar. (tanılama düzeyinde toplanan hata ayıklama ve hata ayıklama-güvenli olmayan)
Bu düzey istek ve yanıt yüklerini yakaladığından ve günlüğe kaydetmeyi seçerseniz (varsayılan olarak verbose
düzeyde @azure/logger tarafından günlüğe kaydedilir) bu düzey CosmosDiagnostics
tanılama düzeyini üretim ortamında hiçbir zaman debug-unsafe
olarak ayarlamadığınızdan emin olun. Bu yükler günlük havuzlarınızda yakalanabilir.
TanılamaYı Kullanma
-
diagnostics
tüm Yanıt nesnelerine eklendiğinden.CosmosDiagnostic
program aracılığıyla aşağıdaki gibi erişebilirsiniz.
// For point look up operations
const { container, diagnostics: containerCreateDiagnostic } =
await database.containers.createIfNotExists({
id: containerId,
partitionKey: {
paths: ["/key1"],
},
});
// For Batch operations
const operations: OperationInput[] = [
{
operationType: BulkOperationType.Create,
resourceBody: { id: 'A', key: "A", school: "high" },
},
];
const response = await container.items.batch(operations, "A");
// For query operations
const queryIterator = container.items.query("select * from c");
const { resources, diagnostics } = await queryIterator.fetchAll();
// While error handling
try {
// Some operation that might fail
} catch (err) {
const diagnostics = err.diagnostics
}
-
diagnostics
@azure/logger
kullanarak da günlüğe kaydedebilirsiniz. Tanılama her zamanverbose
düzeyde@azure/logger
kullanılarak günlüğe kaydedilir. Dolayısıyla Tanılama düzeyinidebug
veyadebug-unsafe
ve@azure/logger
düzeyiniverbose
olarak ayarlarsanızdiagnostics
günlüğe kaydedilir.
Sonraki adımlar
Daha fazla örnek kod
SDK'nın GitHub deposunda kullanabileceğiniz çeşitli örnekler. Bu örnekler Cosmos DB ile çalışırken yaygın olarak karşılaşılan ek senaryolar için örnek kod sağlar:
- Veritabanı İşlemleri
- Kapsayıcı İşlemleri
- Öğe İşlemleri
- Dizin Oluşturmayı Yapılandırma
- Kapsayıcı Değişiklik Akışını okuma
- Saklı Yordamlar
- Veritabanı/Kapsayıcı aktarım hızı ayarlarını değiştirme
- Çok Bölgeli Yazma İşlemleri
Sınırlama
Şu anda aşağıdaki özellikler desteklenmez. Alternatif seçenekler için aşağıdaki Geçici Çözümler bölümüne bakın.
Veri Düzlemi Sınırlamaları:
- DISTINCT alt sorgusundan COUNT içeren sorgular
- Doğrudan TCP Modu erişimi
- Sıralama, sayma ve farklı gibi bölümler arası sorguları toplama, devamlılık belirteçlerini desteklemez. SELECT * FROM gibi akışla aktarılabilir sorgular WHERE , devamlılık belirteçlerini destekler. Devam belirteci olmadan akışla aktarılamayan sorguları yürütmek için "Geçici Çözüm" bölümüne bakın.
- Değişiklik Akışı: İşlemci
- Değişiklik Akışı: Birden çok bölüm anahtarı değerini okuma
- #27059
kısmi hiyerarşik bölüm anahtarları için Değişiklik Akışı çekme modeli desteği - Karma türler için bölümler arası ORDER BY
- CollectionSizeUsage, DatabaseUsage ve DocumentUsage ölçümlerini alma
- Jeo-uzamsal dizin oluşturma
- Otomatik Ölçeklendirme aktarım hızını güncelleştirme
Denetim Düzlemi Sınırlamaları:
Geçici çözümler
Bölümler arası sorgular için devamlılık belirteci
Yan araba desenikullanarak devamlılık belirteci desteğiyle çapraz bölümleme sorguları elde edebilirsiniz. Bu desen, uygulamaların heterojen bileşenlerden ve teknolojilerden oluşmasını da sağlayabilir.
Seri olmayan bölümler arası sorgu yürütme
Devamlılık belirteçleri kullanmadan akışla aktarılamayan sorgular yürütmek için, gerekli sorgu belirtimi ve seçenekleriyle bir sorgu yineleyicisi oluşturabilirsiniz. Aşağıdaki örnek kod, devamlılık belirtecine gerek kalmadan tüm sonuçları getirmek için sorgu yineleyicisinin nasıl kullanılacağını gösterir:
const querySpec = {
query: "SELECT c.status, COUNT(c.id) AS count FROM c GROUP BY c.status",
};
const queryOptions = {
maxItemCount: 10, // maximum number of items to return per page
enableCrossPartitionQuery: true,
};
const querIterator = await container.items.query(querySpec, queryOptions);
while (querIterator.hasMoreResults()) {
const { resources: result } = await querIterator.fetchNext();
//Do something with result
}
Bu yaklaşım akışla aktarılabilir sorgular için de kullanılabilir.
Denetim Düzlemi işlemleri
Genellikle
Ek belgeler
Cosmos DB hizmeti hakkında daha kapsamlı belgeler için docs.microsoft.com
Yararlı bağlantılar
- Azure Cosmos DB Hoş Geldiniz
- hızlı başlangıç
- Öğreticisi
- Örnekleri
- Azure Cosmos DB Hizmeti Kaynak Modeline Giriş
- Azure Cosmos DB Hizmeti SQL API'sine giriş
- Bölümleme
- API Belgeleri
Katkıda
Bu kitaplığa katkıda bulunmak istiyorsanız kodu oluşturma ve test etme hakkında daha fazla bilgi edinmek için lütfen katkıda bulunma kılavuzu okuyun.
Azure SDK for JavaScript