couchbase n1ql (couchbase meetup #7)
DESCRIPTION
Couchbase Meetup #7「N1QL」 NoSQLデータベースであるCouchbase Serverを、SQLライクな構文で検索可能とするN1QLについて紹介しますTRANSCRIPT
N1QLnext generation query language
Fumiharu Kinoshita in Couchbase MeetUP Tokyo - #7
N1QLって?
• 「ニッケル」と読みます
• CouchbaseをSQLライクに検索できる機能
• SQLしか知らない人でもなんとなく使えます
Viewじゃダメなの?• Couchbaseには、標準でViewという検索のための仕組みがあり、非常に高速です。
• ただしViewは、事前に検索する項目を特定しておく必要があり、任意の項目で自由に検索したりソートしたりといったことができません。
• SQLに慣れている人にとって、NoSQLデータベースでの検索は手を出しにくかったりします。
SELECT relation, COUNT(*) AS count, AVG(age) AS avg_age FROM tutorial WHERE age > 18 AND email LIKE '%@yahoo.com' GROUP BY relation HAVING COUNT(*) > 1 ORDER BY AVG(age) DESC LIMIT 1 OFFSET 1
結構なSQLが書けます
なお、CouchbaseはJSON形式でデータを保持しているので、必然的に、検索した結果はJSON形式となります。SELECT * FROM tutorial WHERE name = 'Ian'
{ "resultset": [ { "age": 56, "children": [ { "age": 17, "name": "Abama", } ], "email": "[email protected]", "name": “Ian", } ] }
結果はJSONの配列形式で返却されます
また、結果だけでなく、項目の指定の仕方も多少異なります。 例えば、以下のようなデータで”city”が”東京”の条件で 検索したい場合
SELECT name FROM tutorial WHERE address.city = ‘東京’
{ “name” : “田中 太郎”, “age” : 30, “address” : { ”country”: “日本” “city”: “東京” } }
{ “name” : “田中 太郎”, “age” : 30, “address” : { ”country”: “日本” “city”: “東京” } }
{ “name” : “田中 太郎”, “age” : 30, “address” : { ”country”: “日本” “city”: “東京” } }
配列の構造をもったデータの場合も、以下のように検索することができます。
SELECT age FROM tutorial WHERE children[0].age >10
{ “name” : “田中 太郎”, “age” : 30, “children” : [ { “name”: “一郎”, “age”: 10 }, { ”name”: “二郎” “age”: 7 } ] }
{ “name” : “田中 太郎”, “age” : 30, “children” : [ { “name”: “一郎”, “age”: 10 }, { ”name”: “二郎” “age”: 7 } ] }
{ “name” : “田中 太郎”, “age” : 30, “children” : [ { “name”: “一郎”, “age”: 12 }, { ”name”: “二郎” “age”: 9 } ] }
でも配列のインデックスが 事前にわかるくらいなら 苦労しないんじゃ…
と思った方、普通そう思いますよね?
でも、ちゃんとそのための記法があります
配列中の項目指定SELECT name FROM tutorial WHERE ANY child.age > 10 OVER child IN children END
childrenの配列要素に childの別名をつける
要素中のいずれかのageが10以上
ちなみに、”ANY”を”ALL”にすると、すべての要素が一致という条件が指定できます WHERE ALL child.age > 10 OVER child IN children END
他にも便利なものがあります・配列の長さを条件に指定 WHERE LENGTH(children) > 1 !
・項目の存在チェック WHERE children IS MISSING !
・ドキュメントのIDを取得 SELECT META() as meta FROM xxxxx !
その他にも、まだまだいっぱいあります。
でも、過度な期待はNG• あくまでSQLライクであり、そのものではありません
• 検索のみで、挿入、更新、削除はできません
• まだ、Developer Preview2なのであくまで開発者向け
• お世辞にも速いとは言えません(T_T)
実際に試してみたい方は、オンラインデモのページがありますので、インストールをしなくても実際に試すことができます。
http://query.pub.couchbase.com/tutorial/オンラインチュートリアル
couchbase n1ql 検索
または
おまけ
SQLが使えるなら JDBC Driverとか作れるかも?
そうすればJDBC対応のソフトから、Couchbase が使えるかも!!
!
という安直な考えから、実際に作ってみました
結果として...
• 実質処理の部分と言うよりJDBCのAPIの規格に
従うための実装が大半... • スキーマレスなので、そもそもテーブル情報や
項目の型情報が特定できない。 • メタデータの関連なのか、互換性に難あり?
ご清聴ありがとうございました