Verileri AQL ile Sorgulama
Bu bölümde, verileri AQL ile nasıl sorgulayacağımızı tartışacağız. Daha önceki bölümlerimizde ArangoDB'nin kendi sorgu dilini geliştirdiğini ve AQL adıyla geçtiğini tartışmıştık.
Şimdi AQL ile etkileşim kurmaya başlayalım. Aşağıdaki resimde gösterildiği gibi, web arayüzünde,AQL Editorsekme gezinme çubuğunun üst kısmına yerleştirilir. Boş bir sorgu düzenleyicisi görünecektir.
İhtiyaç duyduğunuzda, aşağıdaki resimde gösterildiği gibi sağ üst köşedeki Sorgu veya Sonuç sekmelerini tıklayarak sonuç görünümünden düzenleyiciye geçebilir ve bunun tersini yapabilirsiniz -
Diğer şeylerin yanı sıra, düzenleyicide sözdizimi vurgulama, geri alma / yineleme işlevi ve sorgu kaydetme vardır. Ayrıntılı bir referans için resmi belgelere bakılabilir. AQL sorgu düzenleyicisinin birkaç temel ve yaygın olarak kullanılan özelliğini vurgulayacağız.
AQL Temelleri
AQL'de bir sorgu, elde edilecek nihai sonucu temsil eder, ancak nihai sonucun elde edileceği süreci temsil etmez. Bu özellik genellikle dilin bildirim özelliği olarak bilinir. Ayrıca, AQL verileri sorgulayabilir ve değiştirebilir ve böylece her iki işlemi birleştirerek karmaşık sorgular oluşturulabilir.
Lütfen AQL'in tamamen ACID uyumlu olduğunu unutmayın. Sorguları okumak veya değiştirmek ya tamamen sonuçlanır ya da hiç sonuçlanmaz. Bir belgenin verilerini okumak bile tutarlı bir veri birimi ile bitecektir.
İki yeni ekledik songszaten oluşturduğumuz şarkı koleksiyonuna. Yazmak yerine, aşağıdaki sorguyu kopyalayıp AQL düzenleyicisine yapıştırabilirsiniz -
FOR song IN [
{
title: "Air-Minded Executive", lyricist: "Johnny Mercer",
composer: "Bernie Hanighen", Year: 1940, _key: "Air-Minded"
},
{
title: "All Mucked Up", lyricist: "Johnny Mercer", composer:
"Andre Previn", Year: 1974, _key: "All_Mucked"
}
]
INSERT song IN songs
Sol alttaki Yürüt düğmesine basın.
İki yeni belge yazacak songs Toplamak.
Bu sorgu, FOR döngüsünün AQL'de nasıl çalıştığını açıklar; koleksiyondaki belgelerin her biri üzerinde kodlanmış işlemleri gerçekleştirerek JSON kodlu belgelerin listesini yineler. Farklı işlemler, yeni yapılar oluşturmak, filtrelemek, belgeleri seçmek, değiştirmek veya veritabanına belge eklemek olabilir (anlık örneğe bakın). Temelde AQL, CRUD işlemlerini verimli bir şekilde gerçekleştirebilir.
Veritabanımızdaki tüm şarkıları bulmak için, aşağıdaki sorguyu bir kez daha çalıştıralım. SELECT * FROM songs SQL türü bir veritabanının (düzenleyici son sorguyu ezberlediği için, *New* düzenleyiciyi temizlemek için düğme) -
FOR song IN songs
RETURN song
Sonuç grubu, şu ana kadar kaydedilmiş şarkıların listesini gösterecektir. songs aşağıdaki ekran görüntüsünde gösterildiği gibi koleksiyon.
Gibi işlemler FILTER, SORT ve LIMIT eklenebilir For loop sonucu daraltmak ve sıralamak için gövde.
FOR song IN songs
FILTER song.Year > 1940
RETURN song
Yukarıdaki sorgu Sonuç sekmesinde 1940 yılından sonra oluşturulan şarkıları verecektir (aşağıdaki resme bakın).
Bu örnekte belge anahtarı kullanılmıştır, ancak başka herhangi bir öznitelik de filtreleme için eşdeğer olarak kullanılabilir. Belge anahtarının benzersiz olması garanti edildiğinden, bu filtreyle birden fazla belge eşleşmeyecektir. Diğer nitelikler için durum bu olmayabilir. İsme göre artan sırada sıralanmış aktif kullanıcıların bir alt kümesini (durum adı verilen bir öznitelikle belirlenir) döndürmek için aşağıdaki sözdizimini kullanırız -
FOR song IN songs
FILTER song.Year > 1940
SORT song.composer
RETURN song
LIMIT 2
Bu örneği bilinçli olarak dahil ettik. Burada, AQL tarafından kırmızıyla vurgulanan bir sorgu sözdizimi hata mesajı görüyoruz. Bu sözdizimi hataları vurgular ve aşağıdaki ekran görüntüsünde gösterildiği gibi sorgularınızın hatalarını ayıklamanıza yardımcı olur.
Şimdi doğru sorguyu çalıştıralım (düzeltmeye dikkat edin) -
FOR song IN songs
FILTER song.Year > 1940
SORT song.composer
LIMIT 2
RETURN song
AQL'de Karmaşık Sorgu
AQL, desteklenen tüm veri türleri için birden fazla işlevle donatılmıştır. Bir sorgu içindeki değişken atama, çok karmaşık iç içe geçmiş yapılar oluşturmaya izin verir. Bu şekilde, veri yoğun işlemler, istemciye (tarayıcı gibi) kıyasla arka uçtaki verilere daha yakın olur. Bunu anlamak için önce rastgele süreleri (uzunluk) şarkılara ekleyelim.
İlk işlevle başlayalım, yani Güncelleme işlevi -
UPDATE { _key: "All_Mucked" }
WITH { length: 180 }
IN songs
Yukarıdaki ekran görüntüsünde gösterildiği gibi bir belgenin yazıldığını görebiliriz.
Şimdi diğer belgeleri (şarkıları) da güncelleyelim.
UPDATE { _key: "Affable_Balding" }
WITH { length: 200 }
IN songs
Artık tüm şarkılarımızın yeni bir niteliğe sahip olup olmadığını kontrol edebiliriz length -
FOR song IN songs
RETURN song
Çıktı
[
{
"_key": "Air-Minded",
"_id": "songs/Air-Minded",
"_rev": "_VkC5lbS---",
"title": "Air-Minded Executive",
"lyricist": "Johnny Mercer",
"composer": "Bernie Hanighen",
"Year": 1940,
"length": 210
},
{
"_key": "Affable_Balding",
"_id": "songs/Affable_Balding",
"_rev": "_VkC4eM2---",
"title": "Affable Balding Me",
"lyricist": "Johnny Mercer",
"composer": "Robert Emmett Dolan",
"Year": 1950,
"length": 200
},
{
"_key": "All_Mucked",
"_id": "songs/All_Mucked",
"_rev": "_Vjah9Pu---",
"title": "All Mucked Up",
"lyricist": "Johnny Mercer",
"composer": "Andre Previn",
"Year": 1974,
"length": 180
},
{
"_key": "Accentchuate_The",
"_id": "songs/Accentchuate_The",
"_rev": "_VkC3WzW---",
"title": "Accentchuate The Politics",
"lyricist": "Johnny Mercer",
"composer": "Harold Arlen",
"Year": 1944,
"length": 190
}
]
LET, FILTER, SORT, vb. Gibi diğer AQL anahtar kelimelerinin kullanımını göstermek için şimdi şarkının sürelerini mm:ss biçim.
Sorgu
FOR song IN songs
FILTER song.length > 150
LET seconds = song.length % 60
LET minutes = FLOOR(song.length / 60)
SORT song.composer
RETURN
{
Title: song.title,
Composer: song.composer,
Duration: CONCAT_SEPARATOR(':',minutes, seconds)
}
Bu sefer şarkının başlığını süresi ile birlikte döndüreceğiz. Return işlevi, her girdi belgesi için döndürülecek yeni bir JSON nesnesi oluşturmanıza izin verir.
Şimdi AQL veritabanının 'Joins' özelliğinden bahsedeceğiz.
Bir koleksiyon oluşturarak başlayalım composer_dob. Ayrıca, sorgu kutusunda aşağıdaki sorguyu çalıştırarak bestecilerin varsayımsal doğum tarihlerini içeren dört belgeyi oluşturacağız -
FOR dob IN [
{composer: "Bernie Hanighen", Year: 1909}
,
{composer: "Robert Emmett Dolan", Year: 1922}
,
{composer: "Andre Previn", Year: 1943}
,
{composer: "Harold Arlen", Year: 1910}
]
INSERT dob in composer_dob
SQL ile benzerliği vurgulamak için, REPLACE işlemine yol açan, ilk olarak iç döngüde, tüm bestecilerin dob'unda ve ardından tüm ilişkili şarkılarda yinelenen, AQL'de iç içe geçmiş bir FOR-döngü sorgusu sunuyoruz ve ardından aşağıdakileri içeren yeni bir belge oluşturuyoruz: nitelik song_with_composer_key onun yerine song öznitelik.
İşte sorgu -
FOR s IN songs
FOR c IN composer_dob
FILTER s.composer == c.composer
LET song_with_composer_key = MERGE(
UNSET(s, 'composer'),
{composer_key:c._key}
)
REPLACE s with song_with_composer_key IN songs
Şimdi sorguyu çalıştıralım FOR song IN songs RETURN song şarkı koleksiyonunun nasıl değiştiğini görmek için tekrar.
Çıktı
[
{
"_key": "Air-Minded",
"_id": "songs/Air-Minded",
"_rev": "_Vk8kFoK---",
"Year": 1940,
"composer_key": "5501",
"length": 210,
"lyricist": "Johnny Mercer",
"title": "Air-Minded Executive"
},
{
"_key": "Affable_Balding",
"_id": "songs/Affable_Balding",
"_rev": "_Vk8kFoK--_",
"Year": 1950,
"composer_key": "5505",
"length": 200,
"lyricist": "Johnny Mercer",
"title": "Affable Balding Me"
},
{
"_key": "All_Mucked",
"_id": "songs/All_Mucked",
"_rev": "_Vk8kFoK--A",
"Year": 1974,
"composer_key": "5507",
"length": 180,
"lyricist": "Johnny Mercer",
"title": "All Mucked Up"
},
{
"_key": "Accentchuate_The",
"_id": "songs/Accentchuate_The",
"_rev": "_Vk8kFoK--B",
"Year": 1944,
"composer_key": "5509",
"length": 190,
"lyricist": "Johnny Mercer",
"title": "Accentchuate The Politics"
}
]
Yukarıdaki sorgu, veri taşıma sürecini tamamlayarak composer_key her şarkıya.
Şimdi bir sonraki sorgu yine yuvalanmış bir FOR-döngü sorgusudur, ancak bu sefer Join işlemine götürür, ilişkili bestecinin adını her şarkıya ekler ("composer_key" yardımıyla seçim) -
FOR s IN songs
FOR c IN composer_dob
FILTER c._key == s.composer_key
RETURN MERGE(s,
{ composer: c.composer }
)
Çıktı
[
{
"Year": 1940,
"_id": "songs/Air-Minded",
"_key": "Air-Minded",
"_rev": "_Vk8kFoK---",
"composer_key": "5501",
"length": 210,
"lyricist": "Johnny Mercer",
"title": "Air-Minded Executive",
"composer": "Bernie Hanighen"
},
{
"Year": 1950,
"_id": "songs/Affable_Balding",
"_key": "Affable_Balding",
"_rev": "_Vk8kFoK--_",
"composer_key": "5505",
"length": 200,
"lyricist": "Johnny Mercer",
"title": "Affable Balding Me",
"composer": "Robert Emmett Dolan"
},
{
"Year": 1974,
"_id": "songs/All_Mucked",
"_key": "All_Mucked",
"_rev": "_Vk8kFoK--A",
"composer_key": "5507",
"length": 180,
"lyricist": "Johnny Mercer",
"title": "All Mucked Up",
"composer": "Andre Previn"
},
{
"Year": 1944,
"_id": "songs/Accentchuate_The",
"_key": "Accentchuate_The",
"_rev": "_Vk8kFoK--B",
"composer_key": "5509",
"length": 190,
"lyricist": "Johnny Mercer",
"title": "Accentchuate The Politics",
"composer": "Harold Arlen"
}
]