ニフクラ mobile backend(mBaaS)お役立ちブログ

スマホアプリ開発にニフクラ mobile backend(mBaaS)。アプリ開発に役立つ情報をおとどけ!

スクリプトで検索したデータを大量削除する【Ruby】

f:id:mbaasblog:20190620114158p:plain:w300

スクリプト機能を使ってクラス内のオブジェクトを一度に大量削除する方法を紹介します。

はじめに

mBaaS開発チームでOJT中、2019年度新入社員の上村です。
mBaaSのAPIにあるオブジェクト削除 では、オブジェクトを1件ずつしか削除出来ません。また、REST APIでは1000件までの情報を一度に取得できますが、もっと大量のオブジェクトを一度に削除したいときってありますよね。

そこで、スクリプト機能を使ってクラス内のオブジェクトを一度に大量削除する方法を紹介します。

削除するサンプルオブジェクトの準備

後述のサンプルスクリプトで削除するのは、

  • クラス名: Item
  • レコード:
    • field1: 20 (数値)
    • field2: hoge (文字列)

が存在するオブジェクトです。これらの検索条件は後にQueryで指定します。

f:id:mbaasblog:20190620114835p:plain

スクリプト作成

まずスクリプトを作成します。今回はRubyで作成していきます。

APPLICATION_KEYCLIENT_KEY はご自身のアプリケーションキーとクライアントキーに差し替えてください。

require "rack"
require "ncmb"
NCMB.initialize(
                application_key: "APPLICATION_KEY",
                client_key: "CLIENT_KEY" 
                )
def call(env)
    req = Rack::Request.new(env)
    # クエリで読み込むパラメータを宣言
    # クエリは文字列で読み込まれるため、数値(int)を入れたいときは末尾に .to_i を入れる
    class_name = req.params["class_name"]
    field_name1 = req.params["field_name1"]
    field_name2 = req.params["field_name2"]
    value1 = req.params["value1"].to_i
    value2 = req.params["value2"]
    limit_num = 1000
    
    begin
        skip_num=0
        items = []
        loop do
            # クラス内の情報を検索して取得
            item = NCMB::DataStore.new(class_name).skip(limit_num * skip_num).limit(limit_num)
              items.push(item.where(field_name1, value1).where(field_name2, value2).all)
            if item.all.count < limit_num
                break
            end
            skip_num+=1
        end
        
        # 取得したオブジェクトを削除
        for delete_num in 0..skip_num
            items[delete_num].each { |i| i.delete }
        end
    
        # 成功
        return [
        200,
        {"Content-Type" => "application/json"},
        [{"result" => "DELETE data successfully!"}.to_json]
        ]
        rescue => e
        # 失敗
        return [
        500,
        {"Content-Type" => "application/json"},
        [{"error" => e.message}.to_json]
        ]
    end
end

オペレータ

また、whereキーのクエリでは完全一致だけでなく、 オペレータを用いることで複雑な検索ができます。

今回のコードでは以下のような検索をしていますが、

item.where("field1", 20).where("field2", "hoge").all

これにオペレータを使い、field1が 10 以上でfield2に ho が含まれるオブジェクト情報を検索するコードに書き換えると以下のようになります。

item.where("field1","$gt":10).where("field2","$regex":"ho").all

ぜひカスタマイズして使ってみてくださいね。

スクリプトのアップロード

上記スクリプトをmBaaSコンソールの「スクリプト」からアップロードします。メソッドはDELETEです。

f:id:mbaasblog:20190620115022p:plain

スクリプトの実行

アップロードしたスクリプトを選択し、実行タブからクエリパラメータを指定します。 今回はQueryに以下のように入力します。

class_name=Item&field_name1=field1&value1=20&field_name2=field2&value2=hoge

f:id:mbaasblog:20190620115142p:plain

実行すると、検索で絞り込んだオブジェクトが削除されていることが確認できるはずです。

f:id:mbaasblog:20190620115156p:plain

タイムアウトエラーが発生してしまう場合は、検索条件に当てはまるデータがすべて削除されるまでスクリプトを複数回実行していただければと思います。

まとめ

今回はRubyスクリプトを使ったデータ大量削除の方法を紹介しました。 Node.jsで大量にデータを削除する場合はこちらを参考にご覧ください。

f:id:mbaasblog:20190621094339j:plain

上村 智子

富士通クラウドテクノロジーズ株式会社に2019年度新卒入社。OJTでニフクラ mobile backend 開発チームに所属。

SPAJAM2019に参加しました!!

f:id:mbaasblog:20190610173520j:plain

6月8日, 9日の2日間で行われたSPAJAM東京B予選にmBaaSチーム5名で参加しました!
mBaaSチーム(ニフクラ mobile backendチーム)でのハッカソンはもちろんのこと、ハッカソン初心者が何名かいる中での挑戦でした!
いつもはプラットフォームを提供している私たちがプラットフォームを使ってアプリを開発する奮闘ぶりをご覧ください!

続きを読む

Webアプリ/Monacaアプリ開発を高速化するローカルトンネルサービスまとめ

f:id:mbaasdevrel:20190410181527p:plain

アプリ開発を素早く進めていく上で大事なのは、ミーティングなどの内容を目の前で反映し、動作確認を進めていくというスピード感です。アニメーションなどの動きが肝になるアプリ開発では、持ち帰ってデザインに反映して…といったやり方では遅すぎます。逆にその場で「こんな動きですか?」と提示できれば話がどんどん進んでいくでしょう。

そこで試してみたいのが、ローカルの内容をインターネット上に公開できるサービスです。これらのサービスとMonacaを組み合わせると、ライブ感溢れる素晴らしいプロトタイピングが可能になることでしょう。

続きを読む

ファイルストアでメタデータを扱う方法

f:id:mbaasdevrel:20190410174052p:plain

ファイルストレージとして便利なファイルストアですが、条件を付けて検索したいと思うことがあります。ファイルストアの検索ではファイル名やmimeType、ファイルサイズなどが指定可能です。

しかし、これだけでは物足りない場合もあるでしょう。そこで使ってみたいのがデータストアとの連携です。

続きを読む

PWAにおけるmBaaSの安全な利用法を考える

f:id:mbaasdevrel:20190410173810p:plain

PWA(Progressive Web Apps)において、mBaaSを使うことでサーバサイドの面倒な実装を省いて、すぐにWebアプリケーションを開発できるようになります。ぜひ使って欲しいのですが、いくつか注意点があります。今回はそんなmBaaSをPWAで利用する上での注意点を紹介します。

続きを読む

オフライン対応を考えよう

f:id:mbaasdevrel:20190410165859p:plain

mBaaSはインターネット接続ありきのサービスです。ネットワークが不安定だったり、オフラインだと多くの機能が利用できません。しかしユーザはそんなことには構わずデータを取得したり、保存したいと考えるでしょう。

そこで使ってみたいのがsaveEventuallyメソッドです。

続きを読む

サブクエリを使いこなそう

f:id:mbaasdevrel:20180913163950p:plain

データストアのクラス同士でデータを連係させる場合、二つの方法が用意されています。

  1. ポインター
  2. リレーション

ポインターは1対n、リレーションはn対nのデータ関係性において利用が可能です。しかし、データ連係を行わずに各クラスにデータを投入してしまっている場合もあるでしょう。そこで使ってみたいのがサブクエリです。

続きを読む

スクリプト機能での各プログラミング言語のバージョンについて

f:id:mbaasdevrel:20180418153723p:plain

スクリプト機能はサーバレスで任意のコードを実行できる機能です。mBaaSでは足りていない機能を補ったり、サーバを用意せずにサーバサイドでコードを実行できます。プログラミング言語としては現在、Node.jsとRubyに対応しています。

2019年04月現在、Node.jsは10.15.0、Rubyは2.6.0が最も新しい利用可能なバージョンとなっています。双方のバージョンにおいて特筆すべき点を紹介します。

続きを読む

外部サイトのデータ取得にスクリプトを使う

f:id:mbaasdevrel:20171212211252p:plain

アプリの中で、外部サイトからデータを取得し、その一部のデータを表示や処理に用いるということはよくあります。Web APIとして公開されていれば問題ありませんが、時にHTMLから取得したり、JSONであってもCORSが設定されていなくてエラーになることもあります。

そこで外部データを取得する際に使ってみたいのがスクリプト機能です。

続きを読む

KotlinでNCMBを使う:ファイルストアへテキストファイルをアップロード/ダウンロードする

f:id:mbaasdevrel:20181207095244p:plain

AndroidではJavaの他、Kotlinも公式言語としてサポートされています。KotlinはJVM上で動作する静的な型付け言語で、言語体系がSwiftに似ています。そのため、Swiftに慣れた開発者であればすぐに習得できるかと思います(似ているので逆に戸惑う部分もあるのですが)。

今回はAndroid Studio 3系を使い、KotlinでNCMBを利用する方法を解説します。今回はテキストファイルをファイルストアにアップロード、そしてダウンロードする方法を解説します。

続きを読む

★☆3年ぶり★☆岡山情報ビジネス学院の皆さんがFJCTに来社されました!

f:id:mbaasblog:20190603091853j:plain
岡山情報ビジネス学院の皆さんと記念撮影

先日5月31日(木)、専門学校岡山情報ビジネス学院の2年生33名+引率の先生2名が遥々岡山県より3年ぶりに来社されました!約2時間ほどの滞在で、会社やサービス、エンジニアとしての働き方などをご紹介する座学セミナーと mobile backend 導入ハンズオンセミナーを受講いただきました。

続きを読む

ニフクラのタイマー機能を使ってスクリプトを定期実行する

DOMとは「Document Object Model」の略だ。 直訳すると、「ドキュメントを物として扱うモデル」になる。HTMLやXMLを扱うための仕組みだ。 主に以下のような特徴をもっている。 ・ツリー構造とも呼ばれる階層構造を取る ・それぞれノードという言葉で説明される ・WEBページとJavaScriptなどのプログラミング言語とを繋ぐ (JavaScript初心者でもすぐわかる!DOMとは何か?)。

https://blog.mbaas.nifcloud.com/entry/2018/10/24/135942

f:id:mbaasdevrel:20190520140341p:plain

ニフクラはサーバやストレージなど様々な機能を提供していますが、その中にスクリプトとタイマー機能があります。スクリプトはNCMBで提供されているものと同じで、Node.jsやRubyを実行できます。そしてタイマー機能を組み合わせることで、定期的にスクリプトを呼び出せます。

今回はこのスクリプトとタイマー機能を組み合わせて、定期的にプッシュ通知を送信する仕組みを作ります。

続きを読む

サーバサイドのJavaでmBaaSにアクセスする(POST編)

f:id:mbaasdevrel:20190318155501p:plain

mBaaSではAndroid向けにJava SDKを提供していますが、これはAndroidと密結合になっており、サーバサイドで利用できるものではありません。そこで純粋なJavaを用いてmBaaSにアクセスしてみましょう。

前回、署名を生成する処理とGET処理を紹介しました。今回はmBaaSにPOSTする処理を紹介します。

続きを読む