LoginSignup
0
0

More than 1 year has passed since last update.

rails ActiveRecordでjsonの値を取り出す

Posted at

ActiveRecordでjsonの値を取り出す

mongoDB query embedded documentsとかを検索ワードにして調べてみました。

https://stackoverflow.com/questions/3954520/mongoid-mongodb-and-querying-embedded-documents
https://stackoverflow.com/questions/24749312/mongoid-querying-embedded-docs/24749539

階層化されているjsonデータは.でつなげば取得できそう。

今回やりたかったのはwhereでcptrans内の特定keyの値がnullでない場合のレコードだけを抽出

Networkモデル

{
    _id: 1,
    cptrans: {
        _id: ObjectId('61712564a3519d0001fe97aa'),
        mcc: 440,
        mnc: 51,
        tracking_area_code: 41481,
        cell_id: '68030469',
        location_area_code: 0,
        rsrp: -66,
        rssi: -41,
        rsrq: -7,
        rssnr: 0,
        traffic_channel: 0,
        band: 18,
        radio_interface: 'LTE',
        band_width: '0',
    }
}

Networksモデルに上記のようなjsonデータがmongoDBに格納されている
ここからwhereでcptrans内の特定keyの値がnullでない場合のレコードだけを抽出したい場合
下記のようになる.

結果

rank_typeに抽出したいkeyをいれてあげる

Nerwork.where("cptrans.#{rank_type}" => { '$ne' => nil })

私はkey毎に抽出を変えたかったのでsocpeを作成し、下記のような感じで対処しました。
scopeって何それって人はこれ参考にするといいかも
https://qiita.com/ngron/items/14a39ce62c9d30bf3ac3

scope :rank_type, ->(rank_type) {
    case rank_type
    when :rsrp, :rsrq, :rssnr                 then where('cptrans' => { '$ne' => nil })
    when :rssi, :nr_rssi, :nr_rsrp, :nr_rsrq  then where("cptrans.#{rank_type}" => { '$ne' => nil })
    when :tx_rate                             then where('iperf' => { '$ne' => nil })
    end
  }

 参考

scope
https://qiita.com/ngron/items/14a39ce62c9d30bf3ac3

mongoDBのハッシュ値の取得
https://stackoverflow.com/questions/3954520/mongoid-mongodb-and-querying-embedded-documents
https://stackoverflow.com/questions/24749312/mongoid-querying-embedded-docs/24749539

0
0
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
0
0