3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

NoSQL&NewSQLAdvent Calendar 2017

Day 25

Couchbase 5.0でリリースされたcURLという名のジャイアニズムでAPIをSELECT文で取得する

Posted at

Couchbaseで5.0から cURLという関数が実装されました。
DBなのに cURL が使えてしまうのです。
https://blog.couchbase.com/developer-release-curl-n1ql/

つまりどういうことかというのを Google MapのAPIで説明すると。

SELECT CURL("https://maps.googleapis.com/maps/api/geocode/json", {"request":"GET", "data":"address=minato&components=country:Japan&key=APIKEY"});

というようにCouchbase (データベース)にリクエストすると、
Couchbaseはまるで自分が保持しているかのように、リクエスト結果をリクエスト結果を返します。
(もちろんCouchbaseはGoogle MapのAPIレスポンスを事前に保持してはいません。)

[
  {
    "$1": {
      "results": [
        {
          "address_components": [
            {
              "long_name": "Minato",
              "short_name": "Minato",
              "types": [
                "locality",
                "political"
              ]
            },
            {
              "long_name": "Tokyo",
              "short_name": "Tokyo",
              "types": [
                "administrative_area_level_1",
                "political"
              ]
            },
            {
              "long_name": "Japan",
              "short_name": "JP",
              "types": [
                "country",
                "political"
              ]
            }
          ],
          "formatted_address": "Minato, Tokyo, Japan",
          "geometry": {
            "bounds": {
              "northeast": {
                "lat": 35.6825986,
                "lng": 139.7828356
              },
              "southwest": {
                "lat": 35.6231249,
                "lng": 139.7087511
              }
            },
            "location": {
              "lat": 35.6580681,
              "lng": 139.7515992
            },
            "location_type": "APPROXIMATE",
            "viewport": {
              "northeast": {
                "lat": 35.6825986,
                "lng": 139.7828356
              },
              "southwest": {
                "lat": 35.6231249,
                "lng": 139.7087511
              }
            }
          },
          "place_id": "ChIJ8yIZtLuLGGARrGzw8nX96zM",
          "types": [
            "locality",
            "political"
          ]
        }
      ],
      "status": "OK"
    }
  }
]

(ローカル環境で649msかかりました)

これだけだと、普通にcURLを叩いたのと大差ありません。

たとえば、先程のリクエストのうち、必要なものは、 geometry だけだったとしたらどうでしょう?
通常のSELECT文同様に扱えるので、FROMをcURLのリクエストにしてSELECTで取得したい項目を絞れます。

SELECT result.geometry FROM CURL("https://maps.googleapis.com/maps/api/geocode/json", {"request":"GET", "data":"address=minato&components=country:Japan&key=APIKEY"}).results[0] AS result;
[
  {
    "geometry": {
      "bounds": {
        "northeast": {
          "lat": 35.6825986,
          "lng": 139.7828356
        },
        "southwest": {
          "lat": 35.6231249,
          "lng": 139.7087511
        }
      },
      "location": {
        "lat": 35.6580681,
        "lng": 139.7515992
      },
      "location_type": "APPROXIMATE",
      "viewport": {
        "northeast": {
          "lat": 35.6825986,
          "lng": 139.7828356
        },
        "southwest": {
          "lat": 35.6231249,
          "lng": 139.7087511
        }
      }
    }
  }
]

(ローカル環境で167.96msかかりました。)

これは、APIで用意されているフィールドの絞込オプションを使っているわけではなく、Couchbaseのエンジンで、項目の出し分けをしているので、APIで想定していないリクエスト結果の取得もプログラムの実装をせずにクエリを書くだけで対応できてしまいます。

今回はやりませんでしたが、普通のデータを扱うのと同じように使えるので、APIの取得結果とDBの内容を突き合わせたい場合も、プログラムでAPIリクエストしてきたデータとDBから取得してきたデータをプログラム書いて突き合わせるのではなく、自前のデータとcURLで取得したデータをCouchbase上でJOINするだけで可能になりました。

おまえのものは俺のもの。俺のものも俺のもの

j1.jpeg

FacebookやTwitterのデータはサービス作るとよく使うので、Couchbaseで取得&加工してからプログラムに渡すとかという使い方ができそうです。

参照: https://developer.couchbase.com/documentation/server/current/n1ql/n1ql-language-reference/curl.html

詳しく書きませんでしたが、cURLを使う場合は、セキュリティの観点からリクエスト先をwhitelistに登録する必要があります。
全ノードでこの対応が必要なので、若干厄介です。参照にwhitelistの作り方も書かれてるので参考にしてください
(デプロイする仕組み作って、おなじwhitelistを全サーバに展開するとかしたら楽そう)

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?